这几天花了两天时间看了一些嵌入式C语言方面的内容,以下是一些读书笔记,记录一下。
- 中断服务程序
1、不能有返回值
2、不能向ISR传递参数
3、ISR尽可能的短
4、Printf有重入问题
- 硬件驱动模块
1、中断服务程序ISR
2、硬件初始化
- 内存操作
1、某IO芯片被定为在CPU的存储空间而非IO空间,而且寄存器对应于某特定地址
2、两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单元书写内容以在对段CPU产生中断
3、读取在ROM或FLASH的特定单元所烧录到汉字或英文字模
在使用绝对地址指针是,自增自减操作的结果取决于指针所指向的数据类型
p++ => p += sizeof(typeof(*p))
CPU以字节为单位编址,C语言指针以指向的数据类型长度作自增自减
- 函数指针
函数只是一个地址,可以如下使用。
Typedef void (*func)();
Func ifunc = (func)0xF000FFF0;
Ifunc();
- 数组 vs. 动态申请
1、尽可能选用数组
2、动态申请,malloc和free成对出现
- 关键字const
Const意味着只读
Const int a; a只读
Int const a; a只读
Const int *a; 指针a指向的只读
Int * const a; a本身只读
Int const *a const; 综合上面两个
- 关键字volatile
1、并行设备的硬件寄存器
2、一个中断服务子程序会访问到的非自动变量
3、多线程应用中几个线程共享的
CPU字长和存储器位宽不一致处理
- 如何应用面向对象到嵌入式开发中
- 性能优化
1、使用宏定义
2、使用寄存器变量
3、内嵌汇编
4、或用位操作
- 代码的运算速度
1、二维转换为一维
2、去掉浮点运算
3、用移位替代除法
4、预先计算查表
5、依赖硬件实现
6、Inline asm
- 数组大揭秘
1、数组名的内涵在于其指代实体是一种数据结构
2、数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量
3、指向数组的指针则是另外一种变量类型,仅意味着数组存放地址
4、数组名作为函数型参时,沦为普通指针