6)任务恢复函数 有任务挂起函数,就有任务恢复函数,通过该函数将被挂起的任务恢复,让调度器能够重新调度该函数。UCOSII 提供的任务恢复函数原型为: INT8U OSTaskResume(INT8U prio); 7)任务信息查询 在应用程序中我们经常要了解任务信息,查询任务信息函数原型为: INT8U OSTaskQuery(INT8U prio,OS_TCB *pdata); 这个函数获得的是对应任务的 OS_TCB 中内容的拷贝。 从上面这些函数我们可以看出,对于每个任务,有一个非常关键的参数就是任务优先级prio,在UCOS 中,任务优先级可以用来作为任务的唯一标识,所以任务优先级对任务而言是唯一的,而且是不可重复的。 UCOSII 与任务相关的函数我们就介绍这么多。最后,我们来看看在 STM32 上面运行UCOSII的步骤: 1)移植 UCOSII 要想 UCOSII 在 STM32 正常运行,当然首先是需要移植 UCOSII,这部分我们已经为大家做好了(参考光盘源码,想自己移植的,请参考光盘 UCOSII 资料)。 这里我们要特别注意一个地方,ALIENTEK 提供的 SYSTEM 文件夹里面的系统函数直接支持 UCOSII,只需要在 sys.h 文件里面将:SYSTEM_SUPPORT_UCOS 宏定义改为 1,即可通过 delay_init 函数初始化 UCOSII 的系统时钟节拍,为 UCOSII 提供时钟节拍。 2)编写任务函数并设置其堆栈大小和优先级等参数。 编写任务函数,以便 UCOSII 调用。设置函数堆栈大小,这个需要根据函数的需求来设置,如果任务函数的局部变量多,嵌套层数多,那么相应的堆栈就得大一些,如果堆栈设置小了,很可能出现的结果就是 CPU进入 HardFault,遇到这种情况,你就必须把堆栈设置大一点了。另外,有些地方还需要注意堆栈字节对齐的问题,如果任务运行出现莫名其妙的错误(比如用到sprintf 出错),请考虑是不是字节对齐的问题。设置任务优先级,这个需要大家根据任务的重要性和实时性设置,记住高优先级的任务有优先使用 CPU 的权利。 3)初始化 UCOSII,并在 UCOSII 中创建任务 调用 OSInit,初始化 UCOSII 的所有变量和数据结构,然后通过调用 OSTaskCreate 函 数创建我们的任务。 4)启动 UCOSII 调用 OSStart,启动 UCOSII。通过以上 4 个步骤,UCOSII 就开始在 STM32 上面运行了,这里还需要注意我们必须对os_cfg.h 进行部分配置,以满足我们自己的需要。以上机会都是转【正点原子】的,希望原子哥能理解一下,写的太好了,借用一下。 二、硬件原理图 硬件原理图很简单,在本序列的跑马灯里面就有。这里就不作过多的介绍。 下面主要看的是STM32F4探索套件的LED灯部分的原理图。 从上面的原理可以看见,很简单,只要给一个高电平LED就会亮,这就不多讲了。STM32F4探索套件就是两个用 户LED灯,LED3和LED4一个位绿色,一个为红色。 三、软件编写 在写程序的时候,首先按一下步骤检查是否已经完备。 1.确保JP3和CN4跳线是连接的【Discovery模式】。 2.通过Min USB把开发板和电脑连接,USB供电。 3.通过ST-Link/V2来下载程序。 4.检查USB通讯的LED1灯是否亮,电源灯LED2是否亮(3.3v) 以上正常就可以进行下面的工作了。 /*************************************** * 函数描述:主函数 * 输入参数:No * 返 回 值:No * 说 明: * 修改记录: ****************************************/ int main(void) { OS_CPU_SysTickInit(); //设置SysTick,并允许中断。 bsp_init(); OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务 OSStart(); //开始任务调度 return(0); } /*************************************** * 函数描述:开始任务 * 输入参数:*pdata * 返 回 值:No * 说 明: * 修改记录: ****************************************/ void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata = pdata; OSStatInit(); //初始化统计任务.这里会延时1秒钟左右 OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断) OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); OSTaskCreate(led2_task,(void *)0,(OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); //挂起起始任务. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) } 四、下载验证 可以看到红绿LED灯交替闪烁。
[size=0.83em]IMG_20140321_100834.jpg (2.29 MB, 下载次数: 0)
下载附件
[color=rgb(153, 153, 153) !important]11 分钟前 上传
完整代码如下:希望喜欢的评论一下!!!
STM32F429UCOS.zip
(513.13 KB)
|