找回密码
 立即注册
查看: 533|回复: 1

STC单片机uC/OS-II移植记(6):消除原移植程序中系统中断存在的瑕疵

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10906
发表于 2023-5-30 20:21:35 | 显示全部楼层 |阅读模式
本帖最后由 杨为民 于 2024-3-1 18:48 编辑

与错误不同,每一个移植版本都难免存在一些瑕疵,产生瑕疵的原因很多,比如在移植过程中针对某个范例引入了调试语句,比如移植目标不一致产生了多余语句。
本文介绍在前面的基础上进一步消除系统中断程序中存在的瑕疵的原因和定时器0模式3RTOS中的正确用法。
一、系统定时器中断不能采用不可屏蔽模式
1)目前的uC/OS-II移植版本中系统中断使用的定时器0工作模式被设置不可屏蔽中断模式,应该取消,见下图:
Fig01_模式选择.jpg
其中原来第325行是将定时器0设置为模式3:不可屏蔽中断的16位自动重载模式,注销该行可以使模式恢复到第324行设置的模式016位自动重载模式。

2)这两种工作模式的差别见下图:
Fig02_工作模式.jpg
按照官方技术手册的描述:
Fig03_模式3.jpg
也就是说,一旦模式3被启动,普通临界区保护的方法EA=0或者ET0=0都不能停止定时器0的中断发生。另外由于模式3的优先级最高,它可以嵌套到其他任何中断中去。
3RTOS系统离不开临界区保护功能,对于系统中断定时器0能否使用模式3的问题,可以用理论模型的方法来论证。
假定RTOS程序采用进入临界区保护EA=0和退出临界区保护EA=1的方法,假定RTOS程序正在处于临界区保护状态,这时总中断已经被关闭(EA=0)了。
假定这时硬件定时器0计数到点(从FFFFH变为0000H),对于模式3,中断就会强制发生,不管EA=0的限制。
按照uC/OS-II程序程序设计,这时会调用“OSTimeTick”和“OSIntExit”两个函数,在这两个函数中都调用临界区保护方法。
当其中程序执行到进入临界区保护语句“EA=0”后,由于原来程序已经处于临界区保护的范围,就会发生“临界保护区重入”的问题。
当其中程序执行到退出临界区保护语句“EA=1”后,这时就会发生“临界区保护提前中断”的问题。
4)发生“临界保护区重入”后,就等于当前的临界区保护失效了,如果涉及同一个被保护的公共资源(比如任务管理用的TCB,当前任务状态等),等系统中断退出后,公共资源已经改变,程序再基于旧状态执行下去就可能产生不是预期的结果。
5)发生“临界区保护提前中断”后,等系统中断退出后,被中断的临界区保护程序已经失效,这时中断已经被打开系统中断(EA=1),任何其他程序都可以对其保护对象进行操作了。
6)上面的理论分析说明在uC/OS-II操作系统中,系统中断的定时器0不能工作模式3的不可屏蔽中断模式下。
7)关于定时器0模式3RTOS系统中的正确用法。在RISC-VARMCortex-M架构的单片机上,均有一个32位的由硬件时钟驱动的计数器,在RTOS中,这个被设置了以后,所以的软件延时都可以用将其计数值与预期计数值进行比较来实现不受中断影响的精确延时,以及每个任务的休眠时间和定时时间都可以用同样的方法来实现,当计数值达到给定的值时就唤醒任务(抢占式任务调度),或者挂起当前任务切换到新任务(按时间片式任务调度)。
由于目前STC各系列单片机没有这个专用的计数器,因此设计了定时器0模式3来实现这个功能:在这个不可屏蔽中断中驱动一个或者多个32位计数器,供各种用途使用。这时这个中断驱动的计数器就像一个高精度的硬件计数器,不受程序和中断影响。
二、优化系统定时器中断服务程序

8)下图是移植程序中断定时器0系统中断服务程序:
Fig04_系统ISR.jpg
其中第391行和402行程序笔者认为对于模式3是多余,首先在退出定时器0中断之前,它的ISR会被连续执行,其他任何中断都不会发生,因此既不存在有什么中断来嵌套它,也不存在临界区保护问题。
其次对于模式0,首先由于第393行和399行已经是进行了中断嵌入保护的程序,不需要第391行来防止中断嵌套,其次由于在第396行和第399行调用的系统函数中,对临界区都有保护,不需要对整个中断进行保护,因此这两行程序是多余的,应该像图中那样被注释掉。

9)对第395行和397行程序在RTOS系统中起什么作用,原移植者没有说明。下图陈是知先生的移植版本,其中也有这两句:
Fig05_TR0保护.jpg
不过,陈先生使用的老的8051单片机,定时器0是没有自动重载功能的,因此必须在ISR重新设置TH0TL0。在任何8051STC单片机中设置定时器的计数值,使用第422行和第425行的保护程序(也是一种临界区保护方法)是正确的、通用的和必须的(见STC单片机范例)。
对于STC8H等单片机,由于采用的模式0具有自动重载的功能,因此笔者认为这两行也是多余的。

10PS:虽然对于定时器0的模式3EAET0都不起控制作用,但其还是可以通过“TR0”来控制的,见下图:
Fig06_定时器0.jpg
如果TR0=0断开了时钟信号,定时器0的计数器值就不会变化,不会产生溢出,也就不会发生中断了,变相地控制了模式3的中断发生。

下图是注释掉定时器0采用模式0和在中断ISR注释掉多余的语句后系统运行效果的逻辑分析仪截屏:
Fig07_正确运行.jpg
从图中可以看到去掉移植瑕疵后,系统运行正常。

关于图的含义见笔者系列篇的前文“
STC
单片机uC/OS-II移植记(5):
纠正原移植程序中将“
RETI
”与“
RET
”混用产生的错误

回复 送花

使用道具 举报

该用户从未签到

552

主题

9492

回帖

1万

积分

管理员

积分
14059
发表于 2023-5-30 20:55:57 | 显示全部楼层
这个 不可屏蔽的 定时器0模式3中断,何为不可屏蔽:
1,用户软件打开后,就不让被软件关闭,只能停电;
2,最高优先级,高于用户看到的所有优先级
===目前可用于简单实用的普通任务调度系统,而暂时不可用于传统的 RTOS
如下的 STC32G库函数应用中,有个简易的任务调度系统,可以使用

1.png
1.png
STC32库函数20230417版及权威使用指南更新 - 软件库函数/原理图库/PCB库 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

回复 支持 反对 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-18 15:53 , Processed in 0.073528 second(s), 35 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表