构建嵌入式系统
文章平均质量分 76
ucan23
没有什么特长,但能吃苦。
展开
-
u-boot lds文件详解
对于.lds文件,决定一个可执行程序的各个段的存储位置,以及入口地址,这也是链接定位的作用。这里以u-boot的lds为例说明uboot的链接过程。首先看一下GNU官方网站上对.lds文件形式的完整描述:SECTIONS {...secname start BLOCK(align) (NOLOAD) : AT ( ldadr ) { contents } >region :p转载 2013-11-18 08:03:08 · 931 阅读 · 0 评论 -
arm-linux-ld: no machine record defined
在编译内核的过程中遇到这样的问题:arm-linux-ld: no machine record defined详细见截图:经过在网上查询说解决放放如下:修改:arch/arm/kernel/vmlinux.lds文件的最后部分:注释掉上图中的ASSERT((__proc_info_en原创 2015-05-18 11:25:17 · 2760 阅读 · 0 评论 -
GCC在C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。1、简单的内嵌汇编例: __asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"转载 2015-04-08 20:18:41 · 1005 阅读 · 0 评论 -
汇编语言---GCC内联汇编
GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编);一、基本内联汇编GCC中基本的内联汇编非常易懂,格式如下:__asm__ [__volatile__] ("instruction list");其中,1.__asm__:它是GCC定义的关键字asm的宏定义(#define __asm__ asm),它用来声明一个转载 2015-04-08 20:15:48 · 851 阅读 · 0 评论 -
USB驱动程序(第十三章 )
1、USB设备基础(1)端点:半双工的 USB端点有四种不同的类型,分别具有不同的输送数据的方式:控制、中断、批量、等时 内核中使用struct usb_host_endpoint结构体来描述USB端点,该结构体在另一个名为struct usb_endpoint_descriptor的结构体中包含了真正的端点信息。该结构体关心的字段有: bEndpointA原创 2013-11-19 13:42:59 · 1409 阅读 · 0 评论 -
中断处理(第十章 )
1、安装中断处理例程 #include int request_irq(unsigned int irq, //正确时返回0 irqreturn_t (*handler) (int, void *, struct pt_regs *), unsigned lon原创 2013-11-19 13:40:41 · 1175 阅读 · 0 评论 -
与硬件通信(第九章 )
1、I/O端口和I/O内存 I/O寄存器和常规内存 Linux提供了4个宏来解决由编译器和硬件重新排序引起的问题: #include void barrier(void); #include void rmb(void); void read_barrier_depends(void); void原创 2013-11-19 13:39:58 · 1013 阅读 · 0 评论 -
内存分配(第八章)
1、kmalloc函数内幕 函数原型: #include void *kmalloc(size_t size, int flags);(1)flags: GFP_ATOMIC: GFP_KERNEL: GFP_USER: GFP_HIGHUSER: GFP_NOIO: GFP_NOFS原创 2013-11-19 13:39:04 · 1117 阅读 · 0 评论 -
高级字符驱动(第六章 )
1、用户空间的ioctl系统调用原型: int ioctl(int fd, unsigned long cmd, ...);//第三个参数的具体形式依赖于第二个参数,其作为第二个参数的参数值。 驱动程序的ioctl函数原型: int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cm原创 2013-11-19 13:36:45 · 942 阅读 · 0 评论 -
字符设备驱动程序(第三章 )
(1)dev_t是表示设备编号的数据类型: #include dev_t(2)从设备好重取出主/次设备编号: int MAJOR(dev_t dev); int MINOR(dev_t dev);(3)从主/从设备编号构造一个设备号: de_t MKDEV(unsigned int major, unsigned int min原创 2013-11-19 11:26:54 · 866 阅读 · 0 评论 -
PCI驱动程序(第十二章 )
1、PCI(Peripheral Component Interconnect) 外围设备互联2、PCI接口(1)PCI寻址:每个PCI外设由一个总线编号,一个设备编号及一个功能编号来标识(biāo zhì 同“标志”,“①表明特征的记号。②表明某种特征。”)。(2)在显示硬件地址时,有时显示为两个值(一个8位的总线编号和一个8位的设备及功能编号),有时显示为三个值(总线、设备和功能)原创 2013-11-19 13:42:06 · 1417 阅读 · 0 评论 -
第十一章 内核的数据类型
1、有关移植性的问题(1)时间间隔(2)页大小(3)字节序(4)数据对齐 若果要访问未对齐的数据,则应该使用下面的宏: #include get_unaligned(ptr); put_unaligned(val, ptr); 在32系统中时4字节对齐,在64位系统中时8字节对齐。(5)指针和错误值 返回原创 2013-11-19 13:41:10 · 941 阅读 · 0 评论 -
时间、延迟及延缓操作(第七章 )
1、使用jiffies计数器 需包含头文件(注:在本人测试的时候系统找不到该头文件,不知道是不是本书的错误之处,在linux系统编程中Robert Love 这样注明的: The Linux kernel now supports “tickless” operation, so this is no longer strictly true.)2、处理器特定的寄存器原创 2013-11-19 13:37:42 · 1238 阅读 · 0 评论 -
调试技术(第四章 )
1、输出文件/proc/kmsg的内容时,回应为里面的内容为空而将进程暂时阻塞,等到有数据是再输出。2、在打印一条可能被重复的信息之前,应调用函数 int printk_ratelimit(void); 如果该函数返回一个非零值则可以继续并打印我们的消息,否则就应该跳过,例: if (printk_ratelimit()){ print原创 2013-11-19 13:34:56 · 1102 阅读 · 0 评论 -
Linux设备驱动程序(第二章)
1、内核开发中没有现成的函数库可以的调用,而只能调用由内核导出的函数。2、printf函数与printk函数除了几个细小的差别外功能几乎相同,最大的不同在于printk函数缺少对浮点数的支持。快速参考 (1)用来装载和卸载模块到正在运行的内核的用户空间的工具: insmod modprobe rmmod (2)用于指定模块的初始化原创 2013-11-19 11:25:59 · 964 阅读 · 0 评论 -
并发和竟态(第五章 )
1、Linux信号量实现: (1)直接创建信号量: void sema_init(struct semaphore *sem, int val); 其中val是赋予信号量一个初始的值。 (2)用下面的方法声明和初始化一个互斥体: DECLARE_MUTEX(name); //一个称为name的信号量被初始化为1 DECLAR原创 2013-11-19 13:35:56 · 1102 阅读 · 0 评论 -
end_request: I/O error, dev mtdblock2, sector 0 Buffer I
内核移植时遇到这个错误:end_request: I/O error, dev mtdblock2, sector 0 Buffer I/O error on device mtdblock2, logical block 0原因分析:由于内核是通过uboot烧写到nandflash中,因此uboot产生的ecc校验码与内核的ecc校验码不同,所以需要关闭内核的ecc校验。原创 2013-11-18 19:30:59 · 3967 阅读 · 0 评论 -
end_request: I/O error, dev mtdblock2, sector 0 Buffer I
内核移植时遇到这个错误:end_request: I/O error, dev mtdblock2, sector 0 Buffer I/O error on device mtdblock2, logical block 0原因分析:由于内核是通过uboot烧写到nandflash中,因此uboot产生的ecc校验码与内核的ecc校验码不同,所以需要关闭内核的ecc校验。原创 2015-05-18 11:28:14 · 3019 阅读 · 1 评论