找回密码
 立即注册
楼主: CosyOS

全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板

 火... [复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-03-28 10:25:35

4

主题

74

回帖

548

积分

高级会员

积分
548
发表于 2024-5-14 17:59:15 | 显示全部楼层
本帖最后由 Yang.Lian 于 2024-5-15 09:07 编辑

楼主是不是可以在1楼做一个目录索引或者搞个 FQA 之类的?这样可以方便各位开发者

比如 #180 楼,非常好的一个结论,不要问我是怎么看到 #180 楼,问就是纯人肉翻出来的

由于我的 INT0 刚好使用了,不知道是不是我运气也还可以,我这个脑瓜子也没想到用 TM4,我直接用了IC没有扇出的 P7x 中断,我用的 STC32G12K128 LQFP32

#define MCUCFG_PENDSVIRQ                P7INT_VECTOR

#define mPendSV_Enable                  P7INTE |= 0x01
#define mPendSV_Disable                 P7INTE &= 0xFE
#define mPendSV_Set                     P70 = 0
#define mPendSV_Clear                   P70 = 1; _nop_(); _nop_(); P7INTF &= 0xFE


运行了一段时间,大概14小时了,未见异常,后来才看到 #180 楼,

很显然,我原本是这么写的
#define mPendSV_Clear                   P7INTF &= 0xFE
不行,后来想到加了一个P70 = 1; 如下
#define mPendSV_Clear                   P70 = 1; P7INTF &= 0xFE
后来才看到 #180 楼才加了两个 _nop();
#define mPendSV_Clear                   P70 = 1; _nop_(); _nop_(); P7INTF &= 0xFE

可以搞个速查手册,方便使用其他的中断来做 PendSV ,节约大家的时间

所以,楼主是不是可以在1楼做一个目录索引或者搞个 FQA 之类的?这样可以方便各位开发者


另外,我用 11.0592M 的外部晶振
#define SYSCFG_SYSCLK                    11059200
然后
#define SYSCFG_SYSTICKCYCLE              1000
无穷无尽的错误提示
后来我小算了一下,发现625或者1250都是合法的,我用了1250,如下
#define SYSCFG_SYSTICKCYCLE              1250
片上运行未见异常
不知道有没有什么潜在风险?


点评

卧槽,可以啊,我之前问能不能借用13号(预留)中断问不出所以然,结果你提出了恰好不被STC32F12K54使用的P6口和P7口中断,这下茅塞顿开了。  发表于 2024-5-15 04:11
感谢你的建议,确实应该搞一个常见问题的汇总和解答,我下一步会着手做这件事。 关于 系统时钟 与 系统滴答周期 的匹配问题,分为 错误 和 警告, #error 系统滴答定时器溢出,必须减小系统时钟或系统滴答周期。 #w  详情 回复 发表于 2024-5-14 19:01
希望这个世界让我装一次B
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-5-14 19:01:18 | 显示全部楼层
本帖最后由 CosyOS 于 2024-5-14 19:18 编辑
Yang.*** 发表于 2024-5-14 17:59
楼主是不是可以在1楼做一个目录索引或者搞个 FQA 之类的?这样可以方便各位开发者

比如 #180 楼,非常好的 ...

感谢你的建议,确实应该搞一个常见问题的汇总和解答,我下一步会着手做这件事。

关于 系统时钟 与 系统滴答周期 的匹配问题,分为 错误 和 警告,
#error 系统滴答定时器溢出,必须减小系统时钟或系统滴答周期。
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统滴答周期。
#warning 每秒钟的系统滴答周期数不为整数,建议重新调整系统时钟或系统滴答周期。
错误是无法容忍的;
警告会让你看着不爽;
但你也可以忽略这些警告,只是说 实际的滴答周期,会与设定值之间有一定误差,这会导致 软件定时器 不准。
你也可以在 mcucfg_80251.h 中,删除这些产生警告的代码。

你系统滴答周期 定义为 1250,不会有任何问题和风险,只是应用 uDelay_ms, uDelay_s, uDelay_m, uDelay_h, 时,时间就时常会不准确了。
这个问题要看你想怎么解决。
对于我来说,系统时钟 没必要 11.0592、22.1184 等,
波特率有一些误差没关系的,只要在允许范围内;
重点还是 系统时钟 要为整数MHZ,这样系统节拍才能准确。

系统时钟最好还要能被12整除,
这样 所有 定时器 无论 1T、12T,定时都是准确的。
如 6MHZ、12MHZ、15MHZ、24MHZ、33MHZ等,都能被12整除。
总之,建议 系统时钟 能被12整除,这样可确保 系统节拍 和 所有 用户定时器 的定时都是准确的。




回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-04-24 16:46:49

3

主题

21

回帖

631

积分

高级会员

积分
631
发表于 2024-5-14 20:59:02 | 显示全部楼层
不愧为国芯,国之大器继续创造辉煌。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-03-28 10:25:35

4

主题

74

回帖

548

积分

高级会员

积分
548
发表于 2024-5-15 09:14:54 | 显示全部楼层
Cos*** 发表于 2024-5-14 19:01
感谢你的建议,确实应该搞一个常见问题的汇总和解答,我下一步会着手做这件事。

关于 系统时钟 与 系统滴 ...

大佬啊,鄙司有很多 11.0592 的库存,是不是一个很合理的理由

"时间时长会不准确了" 应该怎么理解?

就我的应用来说,实时性可能比较重要,剩下的时间就是指示用的,比如,间隔1秒闪灯之类的运行等,报警灯之类的,误差个0.5秒都能接收把

点评

"时间就时常会不准确了" 应该怎么理解? 意思是说有时候,按时间延时可能会不准。 因为 系统滴答周期 为 1250us, 例如你 uDelay_ms(21), 编译后为 uDelay_tc((1000UL * 21) / 1250),uDelay_tc(16); 而实际上,(  详情 回复 发表于 2024-5-15 17:37
那你就用11.0592, #define SYSCFG_SYSCLK 11059200 然后 #define SYSCFG_SYSTICKCYCLE 1000 然后,在 mcucfg_80251.h 中,删除这些产生警告的代码。 而后,接受 系统滴答、软件  详情 回复 发表于 2024-5-15 14:00
希望这个世界让我装一次B
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-5-15 14:00:50 | 显示全部楼层
Yang.*** 发表于 2024-5-15 09:14
大佬啊,鄙司有很多 11.0592 的库存,是不是一个很合理的理由

"时间时长会不准确了" 应该怎么理解?

那你就用11.0592,
#define SYSCFG_SYSCLK                    11059200
然后
#define SYSCFG_SYSTICKCYCLE              1000

然后,在 mcucfg_80251.h 中,删除这些产生警告的代码。
而后,接受  系统滴答、软件定时器 的误差即可。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-5-15 17:37:55 | 显示全部楼层
Yang.*** 发表于 2024-5-15 09:14
大佬啊,鄙司有很多 11.0592 的库存,是不是一个很合理的理由

"时间时长会不准确了" 应该怎么理解?

"时间就时常会不准确了" 应该怎么理解?

意思是说有时候,按时间延时可能会不准。
因为 系统滴答周期 为 1250us,
例如你 uDelay_ms(21),  编译后为 uDelay_tc((1000UL * 21) / 1250),uDelay_tc(16);
而实际上,(1000UL * 21) / 1250 应该等于 16.8,产生些许误差。

至于有时误差是多少,大不大,你需要自己算一下,看是否能满足你 的要求。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-03-28 10:25:35

4

主题

74

回帖

548

积分

高级会员

积分
548
发表于 2024-5-15 18:18:49 | 显示全部楼层
Cos*** 发表于 2024-5-15 17:37
"时间就时常会不准确了" 应该怎么理解?

意思是说有时候,按时间延时可能会不准。

我看了一下cosyII 2.2.1 beta 关于 tick 的实现方式,尝试理解了一下,基本思路就是设置一个 tick 到 当前 task 的 timer,systick 中断中会 timer-- ,当 !timer 的时候调度一下

这个方式的好处当然是快,省资源,但是时间计算的的误差会累计,比如,
timer = 16 实际是16.8 这个 0.8 会被舍去,一直舍去,一直累计下去,如果对累计误差不感冒,这都没有问题

另外一种方式就是多设计一个 start,在设置 timer 的时候,同时设置 start = s_tick_counter;
所以,可以通过 s_tick_counter-start>=timer 来判断,这样就最小程度的减少了累计误差,只是每次的误差都有0.8,这样会多一个start变量,增加资源占用。但是,cosy 是国际化大操作系统,更加精确是不是会更好?

班门弄斧勿怪勿怪

点评

不过仍然要感谢你提出的建议,即使这一次未采用,说不定下一次就会采用了!  发表于 2024-5-15 19:52
首先,感谢你的建议! 软件定时器本就有着天生的1个滴答周期的误差,对于 CosyOS 来说,误差是 -1tick。 实际你在应用的时候,就以1250为例,如果延时时间是10ms、20ms等情况,也就不会有余数了,不会有误差。 只有  详情 回复 发表于 2024-5-15 18:43
希望这个世界让我装一次B
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-5-15 18:43:44 | 显示全部楼层
本帖最后由 CosyOS 于 2024-5-15 18:59 编辑
Yang.*** 发表于 2024-5-15 18:18
我看了一下cosyII 2.2.1 beta 关于 tick 的实现方式,尝试理解了一下,基本思路就是设置一个 tick 到 当 ...

首先,感谢你的建议!
软件定时器本就有着天生的1个滴答周期的误差,对于 CosyOS 来说,误差是 -1tick。
实际你在应用的时候,就以1250为例,如果延时时间是10ms、20ms等情况,也就不会有余数了,不会有误差。


只有在循环中多次延时,才会有累计误差。

你的想法是很好的,应提出表扬,但我不会轻易采用,因为这不仅会增加很多计算时间,还有一些深层问题,弄不好会出错的,是得不尝失的。
还是推荐用户 系统时钟能被12整除,并系统滴答周期为1000us 的方式;或是用户自己使用时注意这个误差的问题。

深层问题,
如 计数器 要分两次 读出,
如果不关闭总中断,可能会被中断打断,TH0、TL0 中读出的数据非同时,可能已经不是一次的数据;
被打断之前已经读完的可能已经是历史了、已经发生改变,再与被打断之后读出的拼接,其结果是错误的;
再有,即使关闭总中断,由于 自动重装载的原因,读出的也有可能不是 一次的数据。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:330
  • 最近打卡:2025-05-02 07:03:31
已绑定手机

2

主题

136

回帖

717

积分

高级会员

积分
717
发表于 2024-5-15 21:03:16 | 显示全部楼层
今天开会,直播课没有看成,只能看录播

点评

看回放也可以的,今天的测试程序很精彩,已经发布了!  发表于 2024-5-15 21:17
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-03-28 10:25:35

4

主题

74

回帖

548

积分

高级会员

积分
548
发表于 2024-5-16 08:57:19 | 显示全部楼层
本帖最后由 Yang.Lian 于 2024-5-16 09:12 编辑

s_cmdline_sendbuff 这个声明并定义了但是没有使用一定有隐藏技能!
是不是可以用在 printf?那就提供一个官方 putchar 实现呗
还是什么其他功能?

不好意思,看走眼了,好像实现不了,这玩意儿定时发送的
希望这个世界让我装一次B
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-5 04:22 , Processed in 0.171694 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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