新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 关于RTX51 TINY的分析与探讨

关于RTX51 TINY的分析与探讨

作者:时间:2012-04-12来源:网络收藏

3 共享资源实现[1]

由于是一个多任务的操作系统,那么就不免会有几个任务使用同一个资源,这些资源可能是一个变量,也可能是输入/输出设备。这就要求一个任务在使用共享资源时必须独占该资源,否则可能会造成数据被破坏。

中实现共享资源独占的方法比较多。比如,可以通过TIMESHARING这个变量来禁止时间片轮转,使其值为0,就可以实现禁止任务切换,从而当前任务就可以独占共享资源。还可以关闭中断来实现,使EA=0,定时器T0的中断被关闭,不能再为时间片轮转提供基准,从而禁止了任务切换。但这两种方法都带有一定的局限性,前一种方法只能适用于实时性要求不高的场合,后一种方法由于T0中断关闭时间不能太长,只能适用于一些简单变量操作的场合。基于以上情况,下面通过另一种方法来实现共享资源的使用。

full中可以利用信号量很好地实现对共享资源的操作,也可以把这种思想应用到RTX51 中;而在RTX51 TINY中不支持信号量,这就要求用户自己定义信号量及其操作过程。以下是部分代码:

struct signal {//定义信号量结构体
    uchar count;//该信号量的当前计数值
    uint list_tasks;//等待该信号量任务表
  } signal_list[3];
  /*初始化信号量 */
  void init_signal(uchar task_id,uchar count) {
    signal_list[task_id].count=count;
    signal_list[task_id].list_tasks=0;
  }
  /*等待信号量 */
  char wait_signal(uchar task_id) {
    if(signal_list[task_id].count>0) {
      signal_list[task_id].count;//获取信号量
      return(-1);
    }
    signal_list[task_id].list_tasks|=(1os_running_task_id());//标记为等待状态
    return(0);
  }
  void wait_sem(uchar task_id) {
    if(wait_signal(task_id==0)
      while(os_wait(K_TMO,255,0)!=RDY_EVENT);//等待,直到该任务就绪
  }
  /*释放信号量 */
  char release_signal(uchar task_id) {
    uchar i:
    uint temp=1;
    if((signal_list[task_id].count>0)||( signal_list[task_id].list_tasks==0)) {
      signal_list[task_id].count++; //释放信号量
      return(-1);
    }
    for(i=0;i16;i++) {
      if((signal_list[task_id].list_tasks(temp))!=0){//查找任务表
        signal_list[task_id].list_tasks= ~(1i);return(i); //返回等待信号量的任务号
      }
      temp=1:
    }
  }
  void release_sem(uchar task_id) {
    char task_temp;
    task_temp=release_signal(task_id);
    if(task_temp!=-1) {
      os_set_ready(task_temp); //任务task_id进入就绪状态
      os_switch_task();
    }
  }



关键词: 探讨 分析 TINY RTX51 关于

评论


相关推荐

技术专区

关闭