arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心:linux為了支援多個硬體體系,在io訪問上做了自己的介面。可以通過io記憶體和io埠這兩種方式進行io訪問。在led的例子上給出這兩種方式的具體實現:
1.利用io port的方式:
#include
#include
#include
#include /* printk() */
#include /* kmalloc() */
#include /* everything... */
#include /* error codes */
#include /* size_t */
#include
#include /* o_accmode */
#include
#include
#include
#include
#include /* cli(), *_flags */
#include /* copy_*_user */
#include
#define led_num 4
struct led_dev
;struct led_dev led[4];
dev_t dev = 0;
static struct resource *led_resource;
int led_open(struct inode *inode, struct file *filp)
int led_release(struct inode *inode, struct file *filp)
ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
else
}struct file_operations led_fops = ;
static int led_init(void)
led_resource = request_region(0x56000014,0x4,"led");
if(led_resource == null)
for(i = 0; i < led_num; i++)
}return 0;
}static void led_exit(void)
unregister_chrdev_region(dev, led_num);
module_init(led_init);
module_exit(led_exit);
module_author("baikal");
module_license("gpl");
module_description("****** led driver");
2.利用io mem的方式:
#include
#include
#include
#include /* printk() */
#include /* kmalloc() */
#include /* everything... */
#include /* error codes */
#include /* size_t */
#include
#include /* o_accmode */
#include
#include
#include
#include /* cli(), *_flags */
#include /* copy_*_user */
#include
#define led_num 4
struct led_dev
;struct led_dev led[4];
dev_t dev = 0;
int led_open(struct inode *inode, struct file *filp)
int led_release(struct inode *inode, struct file *filp)
ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
else
}struct file_operations led_fops = ;
static int led_init(void)
for(i = 0; i < led_num; i++)
}return 0;
}static void led_exit(void)
unregister_chrdev_region(dev, led_num);
module_init(led_init);
module_exit(led_exit);
module_author("baikal");
module_license("gpl");
module_description("****** led driver");
目前,對於具體體系上的linux在移植過程中如何實現這兩種方式的方法還不清楚,現在只是會用。等以後有機會了再慢慢理清楚。
Linux下讀寫暫存器
arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...
通用暫存器 記憶體讀寫
暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...
關於linux下訪問暫存器
由於linux體系特殊的結構,於是我們在嵌入式linux中是不能夠直接訪問暫存器的。比如,我們在51中,想讓乙個io口輸出高電平,只需要讓相應的暫存器置1就可以,但是,linux為了保證其程式的可移植性,以及程式的穩定性,不允許這樣直接訪問暫存器。那麼,linux中怎樣才能夠像我們平常操作微控制器一...