嵌入式C语言的杂七杂八

来源:互联网 发布:淘宝网秋冬打底衫 编辑:程序博客网 时间:2024/05/29 06:36
1,c语言是以功能进行划分的(面对对象中这是错误的)。
        (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
原创粉丝点击