杨为民 发表于 2024-3-25 20:10:30

gentleman 发表于 2024-3-25 19:53
有点巧了

学生就是觉得 定时器0 也是中断


我个人觉得FreeRTOS的这个STC移植版本有些仓促了,好像还有些没有完成,我也在等更新,这是我后面没有继续写如何RTOS编程文章的主要原因。

比如临界区保护方法也只是简单地关闭总中断,比如如何在定时器0以外的其他中断中切换任务(比如一个外部中断发生时唤醒挂起的任务)也没有简明的介绍。
比如你的这个想法,我直观觉得没有那么简单,需要试了才知道。
因此希望楼主和tzz1983坛友能去试试,并且把试的经验和试成功的方法发在这个帖子里,介绍给大家

杨为民 发表于 2024-3-25 20:13:27

gentleman 发表于 2024-3-25 19:53
有点巧了

学生就是觉得 定时器0 也是中断


不是我的,是tzz1983的帖子《FREERTOS中断里切换任务》(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=581)

gentleman 发表于 2024-3-25 20:26:31

杨为民 发表于 2024-3-25 20:10
我个人觉得FreeRTOS的这个STC移植版本有些仓促了,好像还有些没有完成,我也在等更新,这是我后面没有继 ...

看来还是要实测{:4_183:}
感觉是能实现,但可能存在什么风险(比如 频繁进入中断 造成异常之类的)
晚上先不弄了,谢谢杨老师








tzz1983 发表于 2024-3-25 20:26:49

本帖最后由 tzz1983 于 2024-3-25 20:32 编辑

gentleman 发表于 2024-3-25 19:53
有点巧了

学生就是觉得 定时器0 也是中断

我回翻了一下帖子,当时我是这么问的: 
"内核是会在每次节拍的时候切换任务,但是如果我在别的中断中,激活了一个高优先级的任务(比如说xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );然后跟据igherPriorityTaskWoken的值来确定是否要进行任务切换,), 但是,在这里,如果我要切换任务, 却不知道应该怎么操作了,是调哪个函数呢?这是我的疑问.如果这里给了信号量,却没有主动切换任务, 就像您刚才说的那样, 只能等到时钟节拍时才能自动切换任务了, 但是这样并不实时,我想应该有一种方法可以退出中断以后马上做切换任务的动作"
答帖管理是zhp, 答:
"您好,关于您提出的问题,我提供一点个人的理解供您参考
FreeRTOS中提供的任务切换只有两种方式:抢占式和时间片轮询式
时间片轮询式:任务的切换会在主循环中的IDLE进程中进行切换,在当前任务放弃CPU控制权之前,其它任何高优先级的进程都无法抢占CPU
抢占式:每个时间片结束后,在节拍中断中选择优先级最高的任务进行切换,注意此时的任务是在中断中直接切换的,就像您所说中断没退出就切换到任务中去了
若要在其它中断中切换切换任务不能直接调用vPortYield或者taskYIELD,堆栈会乱掉。
如果您确实要在其它非节拍中断中强行切换任务,可参考范例中的vTimer0ISR中的代码"

答案关键字: "如果您确实要在其它非节拍中断中强行切换任务,可参考范例中的vTimer0ISR中的代码",可见,如果要这么做,需要我自己去实现.

原帖参考:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=581&page=1#pid3150

我在印象中,中断->调用OS服务激活一个任务(假设这个任务优先级比当前执行的任务高)-> 退出中断后,立即切换至高优先级任务. 这才是正常的实时切换.
但是: 现在是 中断->调用OS服务激活一个任务(假设这个任务优先级比当前执行的任务高)-> 退出中断后,等到时钟滴答到,时钟滴答找到最高优先就绪,并在退出中断时切换.还是有些区别,就是实时性相差一个时钟滴答,其它问题不大.

前年年底的时候,我也玩过几天FreeRTOS,自己做了一移植,并且也自己实现了即时切换任务,不过后续没有应用,也就凉在一旁了.
代码我也发出来过,就在杨老师的回帖里.
代码链接:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4506&page=1#pid30426

我最近没有计划重温FreeRTOS,并且对这个问题也不是很在意.我提出来,只是说有空的版主可以关注一下这个问题, 但是没有必要为我解决什么问题.





gentleman 发表于 2024-3-25 20:30:19

tzz1983 发表于 2024-3-25 20:26
我回翻了一下帖子,当时我是这么问的: 
"内核是会在每次节拍的时候切换任务,但是如果我在别的中断中,激 ...

好,谢谢老师,我再学习一下{:4_183:}

tzz1983 发表于 2024-3-25 20:51:46

本帖最后由 tzz1983 于 2024-3-25 20:53 编辑

gentleman 发表于 2024-3-25 19:46
我明白老师的意思了

这个中断内切换接口实现起来 要注意什么吗

要注意什么好像倒是没有,这个功能应该是标准OS功能,只不过这里被和谐了而已.

我是这样认为:把"定时器0中断函数 的内容(入栈,取任务,改sp指针,出栈,RETI, ERET)都搬过去"单独弄个调用,这样应该是可以的,就是细节上还得加工一下.

前年的时候,我在关注用中断切换任务,所以没有做这个测试. 

说来也巧,我现在做的uC/OS中断切换任务,源码其实来自我早时移植的FreeRTOS.{:titter:}

来势真 发表于 2024-3-25 20:56:36

如果STC32有RT-thread的版本就更好了,对我们新手很友好了

gentleman 发表于 2024-3-25 21:21:47

tzz1983 发表于 2024-3-25 20:51
要注意什么好像倒是没有,这个功能应该是标准OS功能,只不过这里被和谐了而已.

我是这样认为:把"定时 ...

FreeROTS其实留了个 portYIELD_FROM_ISR() 接口

但移植后port里没实现

tzz1983 发表于 2024-3-25 21:24:43

gentleman 发表于 2024-3-25 21:21
FreeROTS其实留了个 portYIELD_FROM_ISR() 接口

但移植后port里没实现

对呀,标准OS服务本来就是实时切换任务,说多了,还以为我无理取闹{:cry:},我只是不想花这个精力,要是自己去弄,早就好了

tzz1983 发表于 2024-3-25 21:31:10

gentleman 发表于 2024-3-25 21:21
FreeROTS其实留了个 portYIELD_FROM_ISR() 接口

但移植后port里没实现

你要去偿试吗,这个估计要判断中断嵌套,我对FreeRTOS是真忘的差不多了,不知道FreeRTOS有没有现成的中断嵌套计数器.如果没有,那做起来可能还不简单.小心点,别踩雷{:tongue:}
页: 1 2 [3] 4 5 6 7 8 9 10 11 12
查看完整版本: 【全部暂停】【方向改为完善官方的FreeRTOS】 随时关EA的 FreeRT