uC/OS - II中的代码技巧

来源:互联网 发布:淘宝名词解释大全 编辑:程序博客网 时间:2024/04/30 08:56

1. 在.h文件中定义全局变量

全局变量可以在.h文件中定义,但要保证在包含头文件的时候避免重复定义的错误,uC/OS - II中是这样实现的:

ucos_ii.h code

#ifdef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern#endifOS_EXT INT8_U OSIntNesting

os_core.c code

#define OS_GLOBALS#include <ucos_ii.h>

other .c fiels code

#include <ucos_ii.h>

这样的好处是把定义和声明进行了统一,这样以后更改的时候只需要在.h文件中进行相应的修改就行。

2. 赋零函数

很多时候定义一个数组后第一步操作就是清零,(我自己)往往就是写个单独的for循环,比如:

int a[2][3];for (i = 0; i < 2; i++){    for (j = 0; j < 3; j++)    {        a[i][j] = 0;    }}

但要是定义了多个不同维度数组后需要初始化的话就需要写多个for循环清零了,看到uC/OS - II中有这样一个函数:

void OS_MemClr(INT8U *pdest, INT16U size){    while (size > 0u)    {        *pdest++ = (INT8U)0;        size--;    }}

现在有两个数组:

char a[4][5];int b[3][7];

想要清零上述数组的话,代码如下:

OS_MemClr((INT8U*)&a[0][0], sizeof(a));OS_MemClr((INT8U*)&b[0][0], sizeof(b));

3. 去除保留变量的警告或错误提示

在编写一些函数时想保留一些变量作为以后扩展使用,但又不想编译代码时出现“变量定义但未使用”之类的警告的话,可以这么做:

void foo(int param1, int param2, int reserve){    reserve = reserve;    /** do something */}

上述代码中reserve变量保留作为扩展使用。

4. 高效获取结构体成员方法

在获取一个静态的结构体成员内容时,我采用的方法如下:

struct EXAMPLE{    char  a;    int   b;    float c;};static struct EXAMPLE p;void get_struct(struct EXAMPLE *pdata){    pdata->a = p->a;    pdata->b = p->b;    pdata->c = p->c;}

uC/OS - II中采用调用memcpy()函数的方法来提高复制效率,代码如下:

void get_struct(struct EXAMPLE *pdata){    memcpy(pdata, p, sizeof(struct EXAMPLE);}

5. 参数检验

uC/OS - II中的大多数函数对传入参数进行合法性检验后再进行进一步的操作。同时,在调用有返回值的函数时,对返回值的正确性进行检验和确认是良好的习惯。

6. 提高代码移植性技巧

uC/OS - II代码从不使用C语言中的short、int及long等数据类型,因为它们是与编译器相关的,是不可移植的。相反,定义的整型数据结构等既是可移植的,又很直观。

0 0
原创粉丝点击