关于RTX51 TINY的分析与探讨
3 共享资源实现[1]
RTX51 TINY由于是一个多任务的操作系统,那么就不免会有几个任务使用同一个资源,这些资源可能是一个变量,也可能是输入/输出设备。这就要求一个任务在使用共享资源时必须独占该资源,否则可能会造成数据被破坏。
在RTX51 TINY中实现共享资源独占的方法比较多。比如,可以通过TIMESHARING这个变量来禁止时间片轮转,使其值为0,就可以实现禁止任务切换,从而当前任务就可以独占共享资源。还可以关闭中断来实现,使EA=0,定时器T0的中断被关闭,不能再为时间片轮转提供基准,从而禁止了任务切换。但这两种方法都带有一定的局限性,前一种方法只能适用于实时性要求不高的场合,后一种方法由于T0中断关闭时间不能太长,只能适用于一些简单变量操作的场合。基于以上情况,下面通过另一种方法来实现共享资源的使用。
在RTX51 full中可以利用信号量很好地实现对共享资源的操作,也可以把这种思想应用到RTX51 TINY中;而在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();
}
}
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码