嵌入式C语言的杂七杂八
来源:互联网 发布:淘宝网秋冬打底衫 编辑:程序博客网 时间:2024/05/29 06:36
1,c语言是以功能进行划分的(面对对象中这是错误的)。
(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;
(4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从 其它模块寻找外部函数和变量。
2,一个嵌入式系统通常包括两类模块:
(1)硬件驱动模块,一种特定硬件对应一个模块;
(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
3,中断服务程序需要满足如下要求:
(1)不能返回值;
(2)不能向ISR传递参数;
(3) ISR应该尽可能的短小精悍;
(4) printf(char * lpFormatString,…) 函数会带来重入和性能问题,不能在ISR中采用。
4,一个硬件驱动模块通常应包括如下函数:
(1)中断服务程序ISR
(2)硬件初始化
a.修改寄存器,设置硬件参数(如UART应设置其波特率,AD/DA设备应设置其采样速率等);
b.将中断服务程序入口地址写入中断向量表
(3)设置CPU针对该硬件的控制线
a.如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部对应寄存器使其作为控制信号;
b.设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。
(4)提供一系列针对该设备的操作接口函数。例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提 供获取时间、设置时间等函数。
5, (1)C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针;
(2)调用函数实际上等同于"调转指令+参数传递处理+回归位置入栈",本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器;
(3)因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以"调用"一个根本就不存在的函数实体。
6,内存申请和分配
(1)尽可能的选用数组,数组不能越界访问(真理越过一步就是谬误,数组越过界限就光荣地成全了一个混乱的嵌入式系统);
(2)如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现!
7,合理的const和volatile的使用,volatile变量可能用于如下几种情况:
(1) 并行设备的硬件寄存器(如:状态寄存器,例中的代码属于此类);
(2) 一个中断服务子程序中会访问到的非自动变量(也就是全局变量);
(3) 多线程应用中被几个任务共享的变量。
8, 对于宏,我们需要知道三点:
(1)宏定义"像"函数;
(2)宏定义不是函数,因而需要括上所有"参数";
(3)宏定义可能产生副作用。
9,嵌入式C程序中主要使用在线汇编,即在C程序中直接插入_asm{ }内嵌汇编语句。
10,利用位操作,置1,置0.
int a|=(1<<x) //X就是某位需要置1的数字,如第四位置1为: a|=(1<<4)
int b&=~(1<<x) //把某位置0
如果将多个位数置1或者0,也一样
int a|=0000 1111 //后四位置1
int b&=~0000 1111 //后四位置0
注:前面4位没有置位,因此不管他的具体值,如果想要不同位置分别置1置0.上面的可以联合起来。
(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;
(2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;
(3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;(4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从 其它模块寻找外部函数和变量。
2,一个嵌入式系统通常包括两类模块:
(1)硬件驱动模块,一种特定硬件对应一个模块;
(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
3,中断服务程序需要满足如下要求:
(1)不能返回值;
(2)不能向ISR传递参数;
(3) ISR应该尽可能的短小精悍;
(4) printf(char * lpFormatString,…) 函数会带来重入和性能问题,不能在ISR中采用。
4,一个硬件驱动模块通常应包括如下函数:
(1)中断服务程序ISR
(2)硬件初始化
a.修改寄存器,设置硬件参数(如UART应设置其波特率,AD/DA设备应设置其采样速率等);
b.将中断服务程序入口地址写入中断向量表
(3)设置CPU针对该硬件的控制线
a.如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部对应寄存器使其作为控制信号;
b.设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。
(4)提供一系列针对该设备的操作接口函数。例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提 供获取时间、设置时间等函数。
5, (1)C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针;
(2)调用函数实际上等同于"调转指令+参数传递处理+回归位置入栈",本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器;
(3)因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以"调用"一个根本就不存在的函数实体。
6,内存申请和分配
(1)尽可能的选用数组,数组不能越界访问(真理越过一步就是谬误,数组越过界限就光荣地成全了一个混乱的嵌入式系统);
(2)如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现!
7,合理的const和volatile的使用,volatile变量可能用于如下几种情况:
(1) 并行设备的硬件寄存器(如:状态寄存器,例中的代码属于此类);
(2) 一个中断服务子程序中会访问到的非自动变量(也就是全局变量);
(3) 多线程应用中被几个任务共享的变量。
8, 对于宏,我们需要知道三点:
(1)宏定义"像"函数;
(2)宏定义不是函数,因而需要括上所有"参数";
(3)宏定义可能产生副作用。
9,嵌入式C程序中主要使用在线汇编,即在C程序中直接插入_asm{ }内嵌汇编语句。
10,利用位操作,置1,置0.
int a|=(1<<x) //X就是某位需要置1的数字,如第四位置1为: a|=(1<<4)
int b&=~(1<<x) //把某位置0
如果将多个位数置1或者0,也一样
int a|=0000 1111 //后四位置1
int b&=~0000 1111 //后四位置0
注:前面4位没有置位,因此不管他的具体值,如果想要不同位置分别置1置0.上面的可以联合起来。
0 0
- 嵌入式C语言的杂七杂八
- 杂七杂八的C语言问题
- C语言杂七杂八总结
- C/C++的杂七杂八
- C语言总结——杂七杂八
- 嵌入式笔试杂七杂八
- 嵌入式笔试杂七杂八
- 嵌入式Linux下的C语言题
- 嵌入式C语言的一些面试题
- 嵌入式下的C语言精粹
- 嵌入式C语言不可不用的关键字
- C语言:嵌入式系统的消息机制
- 嵌入式C语言不可不用的关键字
- 嵌入式C语言程序的运行
- 嵌入式C语言不可不用的关键字
- C语言在嵌入式系统的不足
- 嵌入式工程师应该知道的C语言
- 嵌入式C语言中volatile的理解
- 如何处理不能安装来自不明身份开发者的app
- HDU 4539 郑厂长系列故事――排兵布阵_状态压缩
- linux下装oracle11g(二)
- 函数模板与模板函数 类模板与模板类
- 【深度探索STL】空间配置器(一) 构造和析构
- 嵌入式C语言的杂七杂八
- android APN相关
- SoapUI简单使用
- 手机测试经验分享
- gsensor方向调试说明
- Java中try catch finally语句中含有return语句的执行情况(总结版)
- 修改Oracle 用户密码
- 详解TimerTask定时器任务
- 面试题11 整数和二元数