购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5.3 样例工程的运行测试

将样例工程编译下载到目标板,重新上电后,可以观察小灯1和小灯2按设定的方案不停闪烁。通过串口4与PC连接,在串口调试器观察到每隔1 s打回来的目标板系统时间。从串口调试器以十六进制发送“4105313233343544”一帧数据,在显示窗口回送了数据帧的内容,如图2-3所示。

在AMQXFW工程框架的样例工程中,设计了四个任务如表2-13所示。

自启动任务task_main是MQX启动调度系统后第一个被调度执行的任务,用于创建其他的任务。虽然就绪队列中还有一个空闲任务,但空闲任务优先级是所有任务中最低的,只有在就绪队列中没有其他任务时才会被执行。自启动任务与被它创建的其他任务相比,它的优先级可以更高或者更低,但建议把自启动任务优先级设置成高于其他任务,否则一旦创建一个任务后,它会被抢占,无法连续创建其他任务,甚至无法创建后续的一些任务,这一点编程时需要注意。task_main函数执行后,首先执行全局变量和外设初始化操作,然后调用创建任务的系统服务_task_create()依次创建task_A任务、task_B任务、task_C任务。在task_main创建完成三个任务后调用系统服务_task_block(),task_main任务被永久地阻塞,离开就绪队列。此时,系统中四个任务则根据优先级执行调度。

图2-3 样例工程测试结果

表2-13 样例任务

task_A和task_B两个任务成为了调度系统中优先级最高的就绪任务,但由于task_A先于task_B进入就绪态,因此优先得到调度。task_A任务完成在一个无限循环中,每隔1 000 ms控制一次小灯亮暗状态的翻转。当task_A任务调用系统服务_time_delay执行延时,调度系统暂时剥夺该任务对CPU的使用权,延时任务进入阻塞态,同时将任务放入延时等待队列中,调度系统调度执行其他就绪任务。当延时结束后,调度系统将该任务重新放入就绪队列,等待调度。因此,在task_A任务调用了_time_delay函数后,就暂停运行,task_B获得调度执行。

当task_B任务自身调用_time_delay后,系统也将其放入延时队列。系统在每次嘀嗒中断时,执行一次系统调度,检查系统中处于就绪态任务和延时队列中是否有满足延时结束的任务。若该任务延时时间已到,则重新将其放入对应优先级就绪队列尾,等待调用。

task_C任务优先级略高于系统空闲任务,是用户创建的优先级最低任务,只当就绪队列中只有task_C任务时才获得调度执行。这里,用户在设计任务时应该注意到该点。或者,为避免永远调度不到此任务,可以采用RR调度策略,采用同优先级设置方法,时间片轮询执行调度。不同的调度策略将会在下文详细介绍。

到此,所有任务都已调度执行,而task_main任务完成串口4中断服务例程的安装,task_C等待串口4中断服务例程对轻量级事件Event_UART4_RecData置1,若Event_UART4_RecData=1说明串口4已经接收到完整的数据帧,并存到全局变量gSCI_ISR_buffer,将此数据帧通过串口4发回PC。这里需注意的是,在MQX系统初始化的过程中,对异常屏蔽寄存器(BASEPRI)进行设置(见“…\MQX\psp\sc_irdyq.c”中对ENABLE_SR的设置),BASEPRI可以屏蔽优先级低于某一阈值的中断,BASEPRI的设置值是根据用户任务的优先级和MQX定义的常量MQX_HARDWARE_INTERRUPT_LEVEL_MAX的值相加决定的。为了避免屏蔽外设中断的响应,影响系统的实时性,用户任务的优先级建议设置低于6(n>6数字大优先级低)。

从程序中可以看出,每个任务仅仅关注自己的执行,就像自己独占CPU一样,无须考虑其他任务的操作,而操作系统内核则负责为所有的任务分配CPU资源,使得每个任务的功能都可以正确地执行。 Iu9qODOdtrXqrAn6sDc4Q72ck2j3mpmlSz0h+D2nUm5BzaK8cbq8JpporI5Dkio1

点击中间区域
呼出菜单
上一章
目录
下一章
×