打印

ucos 低级问题求教

[复制链接]
1403|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
clz918|  楼主 | 2012-11-26 19:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
static  void 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 | 只看该作者
后门~.~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

336

帖子

3

粉丝