ucos 低级问题求教

[复制链接]
 楼主| 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)时指定,例如:
  1. main()
  2. {
  3.     // 创建taskA的两个实例(instance)
  4.     OSCreateTask(taskA, .... , (void*) 1, ....);      // 创建taskA
  5.     OSCreateTask(taskA, .... , (void*) 2, ....);      // 创建taskA
  6. }

  7. void taskA(void* p_arg)
  8. {
  9.      int arg = (int) p_arg;
  10.      ....                        // 相同处理逻辑
  11.      if (arg == 1) {
  12.           ....                   // arg == 1的处理逻辑
  13.      } else if (arg == 2) {
  14.           ....                   // arg == 2的处理逻辑
  15.      }
  16.      ....                        // 其它相同处理逻辑
  17. }
实际上大多数应用中,任务都是比较单一的事件处理,或者即使有不同之处,也可以根据消息的不同来实现,所以p_arg参数基本没啥用,但ucos规定了必须有任务参数,如果任务中仅仅忽略它,有些编译器会发出警告:“定义的参数或变量没有使用”,那么 (void) p_arg; 这个 (void) 语句就是明确告诉编译器:后边的表达式无效。编译器就不会发出警告了。而对于较新的编译器,则可以使用这种更好方法:
  1. void Task_Led1(void*)     // 对于不需要使用的参数,可以只给出类型定义,而不给出参数变量名
  2. {
  3.       ....
  4. }
haitao10086 发表于 2012-12-20 17:03 | 显示全部楼层
后门~.~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

336

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

111

主题

336

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部