初始化中断优先级函数:
void
MY_NVIC_PriorityGroup_Config(uint32_t NVIC_PriorityGroup)
{
//检测输入参数
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
NVIC_PriorityGroupConfig(NVIC_PriorityGroup); //设置中断分组
// uint32_t temp,temp1;
//
// temp1 = (~NVIC_PriorityGroup) &
0x00000007;//取后三位
// temp1 <<= 8;
// temp = SCB->AIRCR; //读取先前的设置
// temp &= 0x0000f8ff; //清空先前分组
// temp |= 0x05fa0000; //写入钥匙
// temp |= temp1;
// SCB->AIRCR = temp; //设置分组
}
在我的工程当中,我将主函数里的初始化中断优先级函数直接用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);代替,以及串口初始化等都改成工程内自定义的函数。
经过以上几步,编译不出现错误。工程当中建立的两个LED任务在操作系统的带领下正常运行,第一次移植就这样完成了,感觉很好。具体见工程《UCOSII实验1》
2015年4月6日
今天,看了任哲老师的嵌入式实时操作系统原理及应用里的有关任务挂起与恢复相关知识,对上次建立的工程中的两个LED任务进行了实验验证。我在LED1任务里边对LED0任务进行挂起与恢复。当LED1执行20次的时候,对LED0任务进行挂起,用函数OSTaskSuspend(LED0_Task_PRIO);实现,当LED1再执行20次的时候,对LED0任务进行恢复,用函数OSTaskResume(LED0_Task_PRIO);实现。这个定义一个整型变量并在if条件句中判断即可实现,具体见工程《UCOSII实验2-1》。
2015年4月7日
今天主要想到能否在一个任务里边先对其进行挂起,然后过一段时间对其进行恢复。经过试验验证,答案是否定的。后来仔细分析了一下,任务本身挂起后已经没有运行了,怎么还能通过它来进行任务的恢复。只能在任务本身中对其挂起,然后在其他任务重对其恢复。想到这些,立即动手实验了一下,发现盲目的挂起与恢复是不能实现的。我们需要判断要实现恢复的任务是否已经挂起,即要查找任务的状态,这里,通过搜集网上资料,可通过一下语句实现:
if(time0==20&&((ptcb->OSTCBStat
& OS_STAT_SUSPEND) != OS_STAT_RDY))//被恢复的任务必须已经被挂起
{
time0
= 0;
OSTaskResume(LED1_Task_PRIO);
}
当然需要先定义任务控制块变量并查表:
OS_TCB *ptcb;
ptcb = OSTCBPrioTbl[LED1_Task_PRIO];
如此,在任务LED1任务中挂起他自身,在任务2中添加上面的任务恢复代码,即可显现恢复。具体见工程《UCOSII实验2-2》。
2015年4月9日
OSSchedLock(void);这个函数又叫上锁函数,如果在一个任务里面调用了上锁函数,那么OSSched()这个任务切换函数就不会执行也就是说不会进任务调度。
调用OSSchedLock()以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用。也就是说,用户程序不得调用OSMboxPend()、OSQPend()、OSSemPend()、OSTaskSuspend(OS_PR1O_SELF)、OSTimeDly()或OSTimeDlyHMSM(),直到OSLockNesting回零为止。因为调度器上了锁,用户就锁住了系统,任何其它任务都不能运行。
调用一次OSSchedLock(),就会对全局变量OSLockNesting加1,调用OSSchedUnlock ()一次就对全局变量OSLockNesting减1。当OSLockNesting是零的时候,系统才能进行任务调度
但是上锁了任务是可以中断,若任务遇到中断,则中断函数的执行会为OSIntNesting变量加1,当中断返回时又要判断OSLockNesting是否为0,如果不为0说明系统仍被锁,直接退出中断。如果OSLockNesting为0说明系统未被锁,CPU进入任务就绪表查找优先级最高的任务。所以上锁函数执行后,CPU一直处于当前任务与中断服务函数之间的运行,直到解锁函数将OSLockNesting和OSIntNesting的值减到0时,方可解除系统锁定。
程序当中通过变量time1累加到10时对任务加锁,加锁后一直执行LED1任务。当time1继续累加到80时对其进行解锁,重新LED1、LED0交替执行,循环往复。具体见工程《UCOSII实验3》。
2015年4月10日
通过信号量控制LED0的亮灭。
OSSemCreate(cnt)赋初始值cnt,OSSemPend一次,cnt-- 一次,OSSemPost一次,cnt++一次。初始化OSSemCreate(1),那么一个任务中有OSSemPend,那么可以执行,执行之后cnt==0,其他任务的OSSemPend无法获得sem,只能等待,除非任务一有OSSemPost,使其cnt++,这样其他任务的Pend可以执行。具体见工程《UCOSII实验4》。
济世良驹于大连理工大学
2015年4月11