1/所存在的问题描述,
在工程main.c编译时,keilMDK报出警告具体如下,
warning: #167-D: argument of type "void (*)(void)" is incompatible with parameter of type "void (*)(void *)"
2/导致问题的原因,
经您提醒和keil的警告定位,我们可以锁定出现问题的代码为主函数中的
OSTaskCreate(my_task,(void*)0, (OS_STK *)&task_stk[127], 10);
函数中的参数给定形式不规范,我们讨论的结果是在第二个参数 (void*)0 或者 在用户任务函数声明时用户任务的形参问题。
结果经过初步几次的改动发现问题并没有解决。
于是我通过调试进入函数OSTaskCreate的源代码去查看,发现OSTaskCreate函数被调用时需要传的参数中第一个参数的形式为
void (*task)(void *p_arg)
也即是OSTaskCreate的第一个参数需要传一个void fun_name(void*)类型的函数指针,这跟我们在main.c中所定义的用户任务
形式有差别,于是我回到main.c中将用户任务的声明改为void my_task(void*); 发现编译时警告没了。
所以,对于该问题出现的原因应该是我们工程中对于用户任务函数的声明定义的不规范导致的,并不是主函数中OSTaskCreate调用
时所给定传递参数不规范的原因。
3/解决办法及测试
解决办法:在一开始对用户任务的声明必须为void task_name(void *task_arg)的这种格式[函数的参数要采用void*],
也即是在调用OSTaskCreate函数时第一个参数的形式必须为上述类型的函数指针,否则报出警告。
测试:
首先我们声明一个全局结构体类型,
typedef struct
{
char a;
int b;
}test_str;
然后在主函数中声明定义一个该结构体类型的变量
test_str temp;
temp.a = 1;
temp.b = 2;
并在调用OSTaskCreate时把它作为第二个参数进行传递,
最后在用户任务中对该参数进行强制转换使用即可。
void my_task(void *arg)
{
test_str *my_arg=arg;
sys_init();
led_init();
OSStatInit();
while(1)
{
LED1_ON;
LED2_OFF;
OSTimeDly(my_arg->b*50);
LED1_OFF;
LED2_ON;
OSTimeDly(100);
}
}
编译没有报出警告,进入调试,结果能正常传递数据,问题解决。
原文地址:https://www.cnblogs.com/banmablog/p/11141546.html