需要使用p_arg的大多数情况是,任务中处理事件或消息的逻辑大部分相同,不同的逻辑较少,如果为了区分这些不同处理,而把整个处理逻辑分为两个或多个不同的任务,系统开销就比较大了,有些得不偿失。比较好的做法是做成一个任务,设置一个任务参数p_arg,不同的处理由这个参数来区别。参数在创建任务(OSCreateTask)时指定,例如:main()
{
// 创建taskA的两个实例(instance)
OSCreateTask(taskA, .... , (void*) 1, ....); // 创建taskA
OSCreateTask(taskA, .... , (void*) 2, ....); // 创建taskA
}
void taskA(void* p_arg)
{
int arg = (int) p_arg;
.... // 相同处理逻辑
if (arg == 1) {
.... // arg == 1的处理逻辑
} else if (arg == 2) {
.... // arg == 2的处理逻辑
}
.... // 其它相同处理逻辑
}
实际上大多数应用中,任务都是比较单一的事件处理,或者即使有不同之处,也可以根据消息的不同来实现,所以p_arg参数基本没啥用,但ucos规定了必须有任务参数,如果任务中仅仅忽略它,有些编译器会发出警告:“定义的参数或变量没有使用”,那么 (void) p_arg; 这个 (void) 语句就是明确告诉编译器:后边的表达式无效。编译器就不会发出警告了。而对于较新的编译器,则可以使用这种更好方法:void Task_Led1(void*) // 对于不需要使用的参数,可以只给出类型定义,而不给出参数变量名
{
....
}
|