需要使用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*) // 对于不需要使用的参数,可以只给出类型定义,而不给出参数变量名
- {
- ....
- }
|