tzz1983 发表于 2024-3-27 08:02:57

本帖最后由 tzz1983 于 2024-3-27 08:23 编辑

LAOXU 发表于 2024-3-27 07:11
tzz1983

2.    本主题的[考题],我心中已经有个答案,只是我已经放弃答题了(弃权都不可再答)。

我的答案是:
论坛内熊仔大神早就移植好的 uC/OS-II @STC8


https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3934&extra=page%3D1


该移植的特征:
1. 所有任务切换都是使用代码切换.
2. 全程有完整的中断嵌套处理, 绝不会出现嵌套的中断直接返回任务的情况. 把滴答改为最高优先级也不会出错。
3. 他对所有中断处理都是一视同仁的, t0也没什么不同,只不过是在t0中断里加了OSTimeTick()功能;用来用作OS滴答。

在该移植的基础上, 只要把滴答中断提升至模式3, 其它不用任何更改, 即可实现关EA后仍可运行OS, 不信你自己可以去试一下。

同样的思维,也可用于STC32G



LAOXU 发表于 2024-3-27 08:25:28

tzz1983 发表于 2024-3-27 08:02
我的答案是:
论坛内熊仔大神早就移植好的 uC/OS-II @STC8



没有达到我心中的目标.

你在任务中关中断没问题.

但是, 假如在某中断中关EA, 再执行 长时间的 PRINTF , 最后开EA, 退出中断.
在这个过程中, OS能进行切换吗? 如何切换?

请继续补充.

gentleman 发表于 2024-3-27 08:25:30

tzz1983 发表于 2024-3-27 07:46
"FreeROTS中中断级 > 任务级
任务切换不在T0也得再 最低级的A 退出后 切换"



C 跑完了 不跑中断B跑任务X
中断B呢 不管了吗,还是跑完X回来跑B   {:4_267:}   
之前的确没遇到这种,官方移植FreeRTOS那条路 不存在有中断不跑 跑任务的{:4_187:}













tzz1983 发表于 2024-3-27 08:35:51

本帖最后由 tzz1983 于 2024-3-27 09:07 编辑

LAOXU 发表于 2024-3-27 08:25
没有达到我心中的目标.

你在任务中关中断没问题.

这样是可以切换的, 只是你被绕进去了, (接下来如果没有明确指出我错误地方,我就不回答了,我要忙工作了)


解释: 在中断里关中断, 中断已经发生!   然后被滴答嵌套, 滴答中断返到原来的中断, 由最后一个即将退出的中断 在退出中断前会切换任务. 熊仔正是这样做的, 而且这也是用代码切换任务时标准的UCOSII的做法, 即每个中断退出前都会检查是否要切换任务.
这一点也是楼主正在思考的问题.


tzz1983 发表于 2024-3-27 08:46:19

gentleman 发表于 2024-3-27 08:25
C 跑完了 不跑中断B跑任务X
中断B呢 不管了吗,还是跑完X回来跑B         
之前的确没遇到这种,官 ...
不好意思, 确实是我晕头了, 就是ABC说不清楚, 怪不得你看不懂, 确实是我写错了

我再重新编辑一下, 红色地方是更改过的. {:sweat:}


现在有 三个中断 A B C

首先中断A最先触发
接着中断B触发,嵌套了,B打断了A
再接着中断C触发,又嵌套了,C打断了B
在中断C里调用了一个OS服务,使任务X就绪了(假设X的任务优先级最高),但是由于中断嵌套中,不能现在马上切换任务,运行完后RETI 至任务B
B也不能切换任务,只能返回A
又回到A了,A检查到 OSIntNesting==0,接下来还要检查A+B+C是否更新了就绪表.
很明显,C更新了就绪表,所以A要进行任务切换.(在这里,A没有使任务就绪,但嵌套链上端的C有,此时由A代替C做任务切换)"



顺序A-B-C-B-A-(退出A+切换任务)

LAOXU 发表于 2024-3-27 08:49:13

关于 丢TICK 脉冲,

是由于响应中断后才计数器清0 造成的, 不同优先级的响应延时时间不同, 那怕 T0(模式3), 进入中断也需要时间, 也有误差, 只不过误差小一点.

彻底解决这个问题, 其实很简单, 只是 tzz1983 又要说我向老姚提建议了.

罢了, 冒着被 tzz1983 批评的风险,

咱多说一句, 只要在定时器装载时 , 不是 MOV (定时常数 --> T0), 而是 ADD , 即, (定时常数 + T0 --> T0) ,

一切问题都迎刃而解, 定时器永远不丢TICK 脉冲, 与优选级无关, 假如老姚把 STC定时器改成这样, 那就是世上最完美的定时器了

gentleman 发表于 2024-3-27 08:54:00

tzz1983 发表于 2024-3-27 08:46
不好意思, 确实是我晕头了, 就是ABC说不清楚, 怪不得你看不懂, 确实是我写错了

我再重新编辑一下, 红色地 ...

这就没有疑问了,感觉距离完美的答卷走了一半了{:4_165:}


兄弟先忙,这个不急的

gentleman 发表于 2024-3-27 09:04:10

LAOXU 发表于 2024-3-27 08:49
关于 丢TICK 脉冲,

是由于响应中断后才计数器清0 造成的, 不同优先级的响应延时时间不同, 那怕 T0(模式3) ...

我这里丢tick是 存在其他中断 进入T0时直接退出导致的
tzz1983 网友 给出的解决方法 时T0 滴答后在退出
我倒是有其他想法,能实现再说,需要定时器支持手动重载








tzz1983 发表于 2024-3-27 09:08:13

本帖最后由 tzz1983 于 2024-3-27 09:11 编辑

LAOXU 发表于 2024-3-27 08:25
没有达到我心中的目标.

你在任务中关中断没问题.

这样是可以切换的

解释: 在中断里关中断, 中断已经发生!   然后被滴答嵌套, 滴答中断返到原来的中断, 由最后一个即将退出的中断 在退出中断前会切换任务.
熊仔正是这样做的, 而且这也是用代码切换任务时标准的UCOSII的做法, 即每个中断退出前都会检查是否要切换任务.

尔, 补充一下: 才发现你是不是逻辑错了(自先矛盾), 中断里关中断, 然后你还想切换?肯定是要等到中断完了退出时才能切换任务呀。
即然是中断完退出时再切换任务, 那又无关是否开中断了, 都已经在中断里了, 退出前切任务就可以了.
就算你之后再也不开EA, 那也是你的应用中断不能触发, T0还是可以触发, 那时候T0就不是嵌套, 自己可以切换任务.所以中断随变你关.

gentleman 发表于 2024-3-27 09:16:32

tzz1983 发表于 2024-3-27 09:08
这样是可以切换的

解释: 在中断里关中断, 中断已经发生!   然后被滴答嵌套, 滴答中断返到原来的中断, 由 ...

其实我一直想说 考题存在这个矛盾

用户程序 使用中断      中断中关了EA    用户自己都不正常了 ,还想OS正不正常
            使用中断      中断外关EA       应该是考核的内容
            不使用中断   那不还是玩具OS吗         
页: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19
查看完整版本: 【全部暂停】【方向改为完善官方的FreeRTOS】 随时关EA的 FreeRT