UCOSiii难疑之——“p_arg = p_arg;”或“(void)p_arg;”
先开门见山:
出现原因:防止编译时出现变量定义但未使用的warning。
1.在ucosii和ucosiii中经常看到,有子函数定义为
void xxxx(void *p_arg)
{
...
p_arg=p_arg;//或者为(void)p_arg;
...
}
程序中的“p_arg=p_arg;//或者为(void)p_arg;”,是为了在编译时候,程序不会产生变量定义未使用的warning,比如下面警告语句:
**…main\main.c(36): warning: #177-D: variable “p_arg” was declared but never referenced
这里的语句就是为了使用下变量,避免出现报警。
2.继续探究为什么后面使用,还要定义一个无类型指针void * p_arg呢。
实则在大部分函数都是在函数体内在确定这指针类型,用来传递一些参数,这个参数就是未知类型的参数,比如在ucosiii任务创建函数中使用了*p_arg传递参数。
void OSTaskCreate (OS_TCB *p_tcb,
CPU_CHAR *p_name,
OS_TASK_PTR p_task,
void *p_arg,//传递参数
OS_PRIO prio,
CPU_STK *p_stk_base,
CPU_STK_SIZE stk_limit,
CPU_STK_SIZE stk_size,
OS_MSG_QTY q_size,
OS_TICK time_quanta,
void *p_ext,
OS_OPT opt,
OS_ERR *p_err)
{
...
p_tcb->TaskEntryArg = p_arg; /* Save task entry argument*/
...
ps:c语言中void无类型只能是是无类型指针,不能修饰无类型变量,因为在同一个mcu下,指针存储是同字节大小的。