uC/OS - II中的代码技巧

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

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

ucos_ii.h code

#ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif

OS_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等数据类型,因为它们是与编译器相关的,是不可移植的。相反,定义的整型数据结构等既是可移植的,又很直观。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值