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