- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-04-30 07:46:22
荣誉版主
- 积分
- 2319
|
发表于 2023-9-14 09:22:50
|
显示全部楼层
杨老师, 这是为何呢? 不怪我说话比较刻薄啊. 讲个故事吧, 我初学51单片机的时候, 书上说中断函数后加上关键字 using x 指定寄存器组, 会节约一些入栈的时间, 于是我就喜欢每次都指定. 后来有一次不对劲了, 原因是我在中断函数中调用了另一个函数, 而被调用的函数没有指定寄存器组, 所以产生了错误 , 但是当时不知道原因啊, 于是我就拼命的查, 代码查不到, 那就仿真, 跟踪, 查汇编, 终于发现了是寄存器组用错了, 当时我高兴啊, 但高兴的不是我找到原因了, 而是"我以为我自己找到了编译器的BUG" , 只是后来才知道, 人家本来的设定就是被调用的函数也需要指定寄存器组. (原来小丑是自己)
说正题吧, STC单片机硬件自动设置“T4IF=0, 这是对的, 但时机可以不在执行RETI的时候哦, 而是在进入中断的时候, 所以你说的那些, 还是不可能存在的. 执行RETI不会清除中断标志, 是一贯的用法, 否则: 不管有没有用OS , 丢失中断标志是一定会发生的. 为此我还特意去验证了一下.
如果真的指出了我程序中的不足, 我会很高兴, 对广大网友也是一种帮助, 但连续几次了啊, 先是说不在临界区切换任务, 后来又说不能嵌套, 再后来又说任务切换一定是中临界区. 再到后来, 熊仔承认了, 我切换任务是在临界区外的. 都是些子虚乌有的东西. 并且刚开始时还能够感觉到态度有些傲慢: 没有直接指出我的问题, 反而是要我去看他的代码. 当然了, 这些都没关系, 我自己也承认自己说话比较傲, 没给别人面子, 这些问题我自己以后慢慢克服.
再说UCOS 熊仔所谓的 "BUG" 吧, 可能上一段回复你还是没有看懂, 三个关键点: OS_TASK_SW(), OSCtxSw(), OSIntCtxSw() 这三个东西是移植者需要做的东西 ,
原本对应关系是:
OS_TASK_SW() ------ 中断指令
OSCtxSw() -----------中断代码(切换任务的专用中断)
OSIntCtxSw()--------------如果你直接从别的中断直接返回, 需要比OSCtxSw() 增加一些操作. 这些东西人家都是放开的, 让你们自己来做的.
现在是你改变了原本的"真意"->就是用代码模似中断过程, 然后返回, 这个方法可以啊, 但是首先是你改变了别人的那点东西, 然后, 顺其自然, 接下来可能出现的问题当然是要你自己去解决了. 这样做是可以的, 如果做好了, 也是最适合51内核的做法, 但是, 因在你, BUG是果, 那你不能由此来说人家有"BUG"呀.
可能就是惯性思维吧, 也可能是因为你刚接触时用的就是51内核, 所以误以为本来就应该是这样的. 柳白说: "身前一尺是他的世界", 此处无敌. 而我却说, 一尺之外, 更有大千世界, 走出来吧, 外面世界很精彩, 我从来都是认同你们的成果的, 但是也请你们不要排外
最后感谢杨老师和熊仔, 这次是真感谢, 由于你们提出的问题, 我确实找到了我中断代码中的一个BUG, 但和杨老师说的不一样, 在我的中断代码中, 如果在开临界段前发生了别的中断, 在别的地方就有可能改变EA的状态(当然这种可以仍然是比较小的), 我程序中这段代码是直接开关中断的, 所以会有问题. 之前的想法是,本身就是中断代码, 即然能运行到这, EA一家是开的, 所以不用保存, 直接开关即可. 但是现在发现了不行. 还是直接用OS临界段模式3来替代吧, 不相差那一点时间
|
|