完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 黑皮男 于 2016-11-14 12:30 编辑
最开始接触单片机的时候,编程思路就是一句接着一句的函数或语句的堆叠,对于定时器的应用,以及一些编程技巧,一点思路都没有。后来工作了,见到了公司的代码,发现这么实现程序的运行真是太好了。也就是固定时间执行主体函数代码,这个固定时间由定时器来产生。后来又接触了实时内核,希望裸机程序也能达到类似任务函数的结构,但是一直没有思路。后来看到了一本书--时间触发嵌入式系统设计模式,介绍了合作式调度器的构建,正是我一直想达到的程序管理结构。合作式调度器的优点是合理分配任务的执行时间,可以达到理想的占用MCU的执行时间,可以达到精致的定期执行,而不会因为某些任务的执行时间不确定性而影响后续任务的执行周期,同时使代码的结构更加清晰,模块的耦合性有所降低,这里就用Nucleo-F412来实现合作式调度器。下面是任务结构的定义:
建立一个任务列表,SCH_MAX_TASKS定义了最大支持任务数。
调度器更新任务状态,在定时器中断中调用,这里是1ms执行一次,以更新任务的运行状态,这里使用sch_state来定义了调度器的运行状态,只有调度器完全初始化,并显式启动调度器后才能更新任务的执行状态。
添加任务到任务列表中,类似于FreeRTOS中的任务创建函数。pFn是任务入口指针,delay定义了任务第一次启动前的延时,period定义了任务的执行周期,如果period为0,调度器启动后,该任务只会执行一次。
从任务控制块数组中删除任务,删除的任务不会执行,相应的任务控制块也会释放出来,以便后续添加任务。
任务分派函数,在while(1)超级循环中调用,查询任务状态,如果就绪,则执行此任务。以及负责系统的错误报告
合作式调度器的使用也很简单,使用前需要先调用sch_init()进行初始化。然后把对应的任务添加进调度器的任务列表中,启动调度器。
任务结构如下void xx_task(void){ /*用户代码*/ } 注:附件是合作式调度器的核心部分代码,限于这乌龟般的网速,暂时没有把整个工程上传,待结项,再把完成的工程包上传
|
|
相关推荐
|
|
看到这个名字就感觉好熟悉,嘿嘿,我也看过这本书,之前在我也发过合作式调度器的代码。我帖子里有这本书,你可以下载。https://bbs.elecfans.com/forum.p ... d=937713&extra= |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HARRY007 发表于 2016-11-14 13:25 多谢了,附件有点大,传不上,多谢分享 |
|
|
|
|
|
http://www.openedv.com/posts/list/43081.htm给个外链接,附件超过论坛限制,5楼的链接也有 |
|
|
|
|
|
2005 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1858 浏览 3 评论
4442 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2007 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2513 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 07:12 , Processed in 0.659152 second(s), Total 86, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号