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

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

 火... [复制链接]

5

主题

1070

回帖

4729

积分

荣誉版主

积分
4729
 楼主| 发表于 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整除,这样可确保 系统节拍 和 所有 用户定时器 的定时都是准确的。




回复

使用道具 举报 送花

3

主题

16

回帖

831

积分

高级会员

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

使用道具 举报 送花

8

主题

89

回帖

1055

积分

金牌会员

积分
1055
发表于 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
回复

使用道具 举报 送花

5

主题

1070

回帖

4729

积分

荣誉版主

积分
4729
 楼主| 发表于 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 中,删除这些产生警告的代码。
而后,接受  系统滴答、软件定时器 的误差即可。
回复

使用道具 举报 送花

5

主题

1070

回帖

4729

积分

荣誉版主

积分
4729
 楼主| 发表于 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,产生些许误差。

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

使用道具 举报 送花

8

主题

89

回帖

1055

积分

金牌会员

积分
1055
发表于 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
回复

使用道具 举报 送花

5

主题

1070

回帖

4729

积分

荣誉版主

积分
4729
 楼主| 发表于 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 中读出的数据非同时,可能已经不是一次的数据;
被打断之前已经读完的可能已经是历史了、已经发生改变,再与被打断之后读出的拼接,其结果是错误的;
再有,即使关闭总中断,由于 自动重装载的原因,读出的也有可能不是 一次的数据。


回复

使用道具 举报 送花

已绑定手机

3

主题

134

回帖

1569

积分

金牌会员

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

点评

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

使用道具 举报 送花

8

主题

89

回帖

1055

积分

金牌会员

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

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

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

使用道具 举报 送花

8

主题

89

回帖

1055

积分

金牌会员

积分
1055
发表于 2024-5-17 14:37:35 | 显示全部楼层
本帖最后由 Yang.Lian 于 2024-5-17 16:17 编辑

在 STC32G12K128 上 使用 COSYII 2.2.1 时候 4/5 中断都可以正常中断
但是 DMA_ADC_VECTOR (48)中断,却中断不了。
用 DMA_ADC_STA |= 0x01,又可以正常进入对应的中断。


如果不使用 COSYII 操作系统,直接 main 里用同样的代码初始化又可以正常中断。

好奇怪,求解

进一步测试发现,这个跟时钟的配置有关系

如果 SYSCFG_SYSCLK 配置成 11059200
且SYSCFG_SYSTICKCYCLE 配置成 1250 就会导致 DMA_ADC_VECTOR (48)中断 进不去

如果 SYSCFG_SYSCLK 配置成 12000000
且SYSCFG_SYSTICKCYCLE 配置成 1000 就没有这个问题 DMA_ADC_VECTOR (48)中断 可以正常进


我晕了个大了,我之前问过 11059200 和 1250 的时钟配置有没有隐患,楼主回复说没有,我就没有往这个事情上想,没想到还真有问题

不知道这算不算一个bug,还是说我不应该用 11059200/1250 的搭配?


点评

从理论上来说,除了误差之外,我确实没想到会有什么隐患。 CosyOS 的 系统滴答周期 和 任务调度 等,怎么会影响到 DMA 中断? 这个问题我也不理解,想不到是什么原因。  详情 回复 发表于 2024-5-17 18:09
你下载最新的 CosyOS-II-STC32G-工程模板 试一下,在顶楼有提供下载。  详情 回复 发表于 2024-5-17 16:20
希望这个世界让我小装一次B
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-11 00:27 , Processed in 0.078849 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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