ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[应用相关] 双任务时间片切换

[复制链接]
235|8
 楼主 | 2019-6-20 23:04 | 显示全部楼层 |阅读模式
上次我们使用任务调度器实现了双任务的切换,在任务1和任务2函数中需要对 umTaskSched()函数进行多次调用,针对这个问题,下面提出关于是否可以自动周期调用umTaskSched()函数的方法。提出了一种基于时间片切换的方式,该方式如何触发?由谁来触发?使用定时器定时溢出产生中断来触发,该定时器就是Systick定时器,它是一个24位倒计数定时器,当计数到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。

使用特权

评论回复
 楼主 | 2019-6-20 23:04 | 显示全部楼层
初始化Systick定时器,让该定时器在n*ms时触发Systick中断,具体代码如下:
// Systick定时器初始化函数
void SetSysTickperiod(uint32_t ms)
{
  SysTick->LOAD = ms*SystemCoreClock/1000-1; //ԤװÔØÖµ
        NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);
        SysTick->VAL = 0;
        SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk|
                        SysTick_CTRL_TICKINT_Msk|
                        SysTick_CTRL_ENABLE_Msk;
}

使用特权

评论回复
 楼主 | 2019-6-20 23:04 | 显示全部楼层
将任务中umTaskSched()函数转移到Systick中断函数中Systick_Hander() 具体代码如下:
//Systick中断函数
void Systick_Hander()
{
  umTaskSched();
}

使用特权

评论回复
 楼主 | 2019-6-20 23:04 | 显示全部楼层
暂且将Systick定时器初始化函数,放置在第一个任务函数中,且将任务1和任务2函数中的  umTaskSched()函数移除,具体如下
348435d0ba0926e07b.png

使用特权

评论回复
 楼主 | 2019-6-20 23:05 | 显示全部楼层
最后需要修改下系统的时钟频率,将SystemCoreClock配置为12M,即是将__XTAL 配置为12000000u   分频系数__SYSTEM_CLOCK设置为1.
463115d0ba0b553c77.png

使用特权

评论回复
 楼主 | 2019-6-20 23:05 | 显示全部楼层
趁着媳妇睡着了,撩一下PendSV异常,本人在调试基于这个实验的时候死活进不去Task2中,花了几个小时一直找,一直找,最后发现是这个原因:在FirstTask()中,我之前没有在意,先是触发PendSV异常,然后再设置优先级,这样的操作导致我后面检查了好久才发现是这个原因,所以这里告诫大家,一些设备的初始化我们尽可能按着顺序来,避免不必要的时间浪费在这无休止的检查中。
981095d0ba0ce0252b.png

使用特权

评论回复
 楼主 | 2019-6-20 23:06 | 显示全部楼层
后我们来一起看一下效果吧!编译代码,Debug仿真运行,直接全速运行代码,下面是逻辑分析的波形,可以看到任务1和任务2执行的时间是相等的,即是Systick中断触发的时间,本次我们就完成了双任务时间片切换。
363715d0ba0de0cbed.png

使用特权

评论回复
 楼主 | 2019-6-20 23:06 | 显示全部楼层
这一期的教程告诉我自己,一定按照套路出牌,按部就班,后期一定有所收获。

使用特权

评论回复
 楼主 | 2019-6-20 23:07 | 显示全部楼层
大家先尝试下,后期上传代码,先练习下哈

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表