clz918 发表于 2012-11-26 19:09

ucos 低级问题求教

staticvoid Task_Led1(void* p_arg)
{

   (void) p_arg;    
   while (1)
   {
      LED_LED1_ON();
      OSTimeDlyHMSM(0, 0, 0, milsec1);
   
      LED_LED1_OFF();
      OSTimeDlyHMSM(0, 0, 0, milsec1);
   }
在这个函数中void* p_arg   和   (void) p_arg; 都是干什么用的?

e_007 发表于 2012-11-26 19:35

后门~.~

john_lee 发表于 2012-11-27 10:51

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

haitao10086 发表于 2012-12-20 17:03

后门~.~
页: [1]
查看完整版本: ucos 低级问题求教