LAOXU
发表于 2024-3-27 12:53:32
gentleman 发表于 2024-3-27 11:44
把球踢回来了是吧
这么整我也反对,都装好了干嘛还自己去装
老古董 的 51 可以实现,
STC的定时器装载, 自动化程度太高了 {:lol:}
等几天我空下来, 帮你写一个吧
随午写的不一定能符合 STC定时器的脾气, 要上机测试后才能保证可行.
可能中间增加的附加代码有点多
杨为民
发表于 2024-3-27 12:55:11
本帖最后由 杨为民 于 2024-3-27 12:56 编辑
tzz1983 发表于 2024-3-27 12:17
闻道有先后,术业有专攻.
什么宗不宗师的, 江山代有人才出
像 LAOXU 和 gentleman 这样勤学爱问的才俊,...
回顾你在这个论坛里的经历,就一个字,玩:
(1)uC/OS-II移植到STC32G上是你在熊仔前面开源到这个论坛的,熊仔照抄了你的方案,做成了一个完整的系统。
(2)FreeRTOS移植的新技术方案,你开源放在我的帖子里就不管了,到现在才又被拿出来。这个新方案是可行的,而且你也验证过了,你可以自己发出来征求大家的意见,形成一个新的FreeRTOS在STC单片机上的移植版。
你还玩,结果很大可能是别人超过你了。
(3)你的新的UCOS2移植版里采用的两项RTOS先进技术:分开堆栈和管理全部中断,这是STM32F什么的主流的RTOS技术,你已经在STC机上实现了,已经验证了,然后就丢给大家玩吗?
(4)现在LAOXU已经在学习你的先进技术了,你自己不想进一步,还只想做个吃瓜群众吗?
(5)不像别人吃蜘蛛,你已经两次吃到螃蟹了,你还玩吗?还㩐下个机会吗?我告诉你,没有了。
(6)另外两个主流RTOS可以用到STC单片机上的先进技术已经被CosyOS实现了,就是系统功能统一调用和调用队列管理。同样是用硬中断切换任务,你实现的技术已经远不如他了。
tzz1983
发表于 2024-3-27 13:20:23
杨为民 发表于 2024-3-27 12:55
回顾你在这个论坛里的经历,就一个字,玩:
(1)uC/OS-II移植到STC32G上是你在熊仔前面开源到这个论坛的 ...
感谢杨老师对我的激励和批评,批评的对, 我确实是比较贪玩了. 今后尽量改正.
FreeRTOS那个版本确实接近尾声了,只缺最后的严谨验证(其实已经没什么毛病).
搁浅在这, 是因为两个原因:
1. 我平常都在用uC/OS.
2. FreeRTOS的源码我打算以后有空再安排时间熟悉.
如果说自己都不是很熟悉就拿出来,那可能是要闹笑话的.
至于什么超越不超越的,那个没关系, 我希望别人超越我, 让我可以轻松吃瓜.
我有瓜也会拿出来大家一起吃. {:lol:}
看情况吧, 如果说下半年还没有人把FreeRTOS完善, 我就来操作一下, 这样安排时间也比较充裕
gentleman
发表于 2024-3-27 16:46:01
LAOXU的梦想就交由他自己完成吧
楼主后面研究方向变为优化官方移植的FreeRTOS
先 实现缺失的 中断内切换任务接口taskYIELD_FROM_ISR()
随时关EA的需求看情况
是狗尾续貂 还是画龙点睛大家拭目以待
tzz1983
发表于 2024-3-27 16:55:39
本帖最后由 tzz1983 于 2024-3-27 16:59 编辑
gentleman 发表于 2024-3-27 16:46
LAOXU的梦想就交由他自己完成吧
楼主后面研究方向变为优化官方移植的FreeRTOS
先 实现缺失的 中断内切换 ...
方向对了,是否接受改为额外PendSv 中断做任务切换?
两种方法:
1. 还是你之前的方法. 难易度你已经体验到了.
2. 改为额外PendSv 中断做任务切换, 难易程度: 简单,改动很少.
两种方法性能相差不多, 对比最终效果:代码切换任务用户体验稍差.需要用户使用勾子或用户自己在中断里额外添加OS服务.中断切换体验稍好, 缺点是额外用一个中断源
gentleman
发表于 2024-3-27 17:18:37
tzz1983 发表于 2024-3-27 16:55
方向对了,是否接受改为额外PendSv 中断做任务切换?
两种方法:
PendSv 吗,这个 看情况吧
我要过两天才开始的{:4_165:}
不懂再来问兄弟{:4_196:}
fanxsp
发表于 2024-3-27 17:25:42
不是很理解,如果在中断嵌套的高优级里直接切换任务,那低优先级中断的优先级就降到比任务还低了,这么做真的好玩吗。
gentleman
发表于 2024-3-27 17:35:19
本帖最后由 gentleman 于 2024-3-27 17:36 编辑
fanxsp 发表于 2024-3-27 17:25
不是很理解,如果在中断嵌套的高优级里直接切换任务,那低优先级中断的优先级就降到比任务还低了,这么做真 ...
LAOXU 的梦想不知道
我和tzz1983兄弟讨论的是中断内如果唤醒高优先级任务就标记等待退出最后一层中断进任务
目前官方移植版 要再退出最后一层中断后 进入t0中断再切换
fanxsp
发表于 2024-3-27 17:42:40
gentleman 发表于 2024-3-27 17:35
LAOXU 的梦想不知道
对啊,这个才是正常思路
tzz1983
发表于 2024-3-27 22:35:43
本帖最后由 tzz1983 于 2024-3-27 22:44 编辑
gentleman 发表于 2024-3-27 17:18
PendSv 吗,这个 看情况吧
我要过两天才开始的
void vTaskSwitchContext( void );
#define _ISR_Package_CODE(n) \
void ISR_Handler_##n (void) \
{ \
__asm{ISR_Handler##n:} /*汇编标号*/ \
portSAVE_CONTEXT(); /*寄存器入栈*/ \
OSIntNesting++; \
EA=1; \
ISR_Handler_Hook##n(); /*app勾子*/ \
EA=0; \
OSIntNesting--; \
if(OSIntNesting==0); \
{ \
__asm { MOV DR0,DR60 } /*SP保存到任务控制块 */ \
__asm { MOV DR4,pxCurrentTCB } \
__asm { MOV @WR6+0x2,WR2 } \
\
vTaskSwitchContext();/*更新pxCurrentTCB*/ \
\
__asm { MOV DR4,pxCurrentTCB }/*读取新任务的SP*/ \
__asm { MOV WR2,@WR6+0x2 } \
__asm { MOV DR60,DR0 } \
} \
portRESTORE_CONTEXT(); /* 出栈,开中断,返回 */ \
EA=1; \
__asm{RETI} \
if(pxCurrentTCB); /* 声明变量 */ \
}
基本上这个意思,可不可以优化你再想一下.
把滴答改回最低优先, 改回低优先后, 滴答也得 OSIntNesting++
套上这个代码去试试, 估计可以成!