项目代码中有这么一句,让我看了好久......真的是脑袋秀逗了
#define PORT_TASK_INIT(task_name) task_##task_name##_create()
##就是起到了连接的作用。
那么再看一些这个宏定义的意义:利用宏,将前一层封装好的函数,直接用。当我们想调用task_logic_create()接口,又要用到task_bat_create()等数十个接口,不用一次一次的写函数名了,太麻烦,万一写错呢,只需要利用宏函数,将具体的任务名字当做参数写进宏函数的参数中就可以调用具体的任务......
牛B啊!
又在项目中看到了这段代码:
void task_##task_name##_create(void)
{
xTaskHandle task_handle = NULL;
xTaskCreate(task_##task_name##_function, #task_name, stack_size, NULL, priority,&task_handle);
queue_handle_##task_name = xQueueCreate(queue_size, sizeof(queue_msg_t));
task_name = queue_handle_##task_name;
vQueueAddToRegistry(queue_handle_##task_name, queue_name_##task_name);
vTaskSetTaskNumber(task_handle, (UBaseType_t)queue_handle_##task_name);
}
我刚才理解错了,宏替换都会替换掉##task_name##,然而上层并没有各种task_logic_create()这样类似函数,每一个任务创建的方式差不多,所以代码复用的话就直接一个void task_##task_name##_create(void) 解决。
牛B啊!