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

STC 原生RTOS PK 移植RTOS

[复制链接]

24

主题

308

回帖

2506

积分

版主

STC

积分
2506
发表于 2023-5-22 13:37:54 | 显示全部楼层
电话:0513-55012982、18106296593 (微信同)
QQ : 1347154513
回复

使用道具 举报 送花

5

主题

1206

回帖

4812

积分

荣誉版主

积分
4812
 楼主| 发表于 2023-5-22 17:30:50 | 显示全部楼层
FreeRTOS的示例代码,采用的方案是:
“全局可重入函数”+ “移除未使用”;
Generate reentrant funcitons + REMOVEUNUSED;

CosyOS的示例代码,采用的方案是:
“数据不覆盖” + “移除未使用”;
NOOVERLAY + REMOVEUNUSED;
NOOVERLAY 会导致 REMOVEUNUSED 移除的不够彻底,很多未使用的代码段、数据段等未能被移除,所以代码量很大。
针对这一问题暂时先不解决,待确定解决方案后再调整。
回复

使用道具 举报 送花

5

主题

1206

回帖

4812

积分

荣誉版主

积分
4812
 楼主| 发表于 2023-5-23 12:35:10 | 显示全部楼层
现已证明,“移除未使用”的前提是“数据覆盖”
只要加入了控制命令:“NOOVERLAY”,那么,“REMOVEUNUSED” 命令将失效。
052301.png

通过测试也证明了这一点。


解决方案:
1、使用控制命令:“NOOVERLAY”,而后用户自己手动删除未使用的C文件或库函数;
2、生成全局可重入函数 + “REMOVEUNUSED” 命令。


CosyOS在下一版中,将同时支持上述两个方案,由用户自己选择。


回复

使用道具 举报 送花

3

主题

45

回帖

1993

积分

金牌会员

积分
1993
发表于 2023-5-26 08:08:51 | 显示全部楼层
有各平台的DEMO工程学习吗?
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25098
发表于 2023-5-26 09:54:29 | 显示全部楼层
STC32G12K128实验箱有验证通过
回复

使用道具 举报 送花

已绑定手机

25

主题

594

回帖

3108

积分

论坛元老

积分
3108
发表于 2023-5-30 07:40:32 | 显示全部楼层
不停地学习
回复

使用道具 举报 送花

24

主题

308

回帖

2506

积分

版主

STC

积分
2506
发表于 2023-5-30 08:52:40 | 显示全部楼层
电话:0513-55012982、18106296593 (微信同)
QQ : 1347154513
回复

使用道具 举报 送花

2

主题

26

回帖

194

积分

注册会员

积分
194
发表于 2023-6-9 19:00:16 | 显示全部楼层
高手打擂台,正是我们学习的好时机,多谢你们的发贴与分享,希望社区高手们更加活跃。
回复

使用道具 举报 送花

1

主题

189

回帖

1506

积分

金牌会员

积分
1506
发表于 2023-10-23 23:37:34 | 显示全部楼层
Cos*** 发表于 2023-5-18 17:14
是这样的杨老师,
按照我的理解,一个全局变量只要最终访问数据时能一条汇编完成访问,就不会重入,包括 ...

关于单字节变量的原子操作问题,我之前的想法和你是一样,后来发现这种想法也是不对的。比如,有一个单字节变量 K,任务1 执行指令 K+=2 ; 任务2 抢先任务1  执行  K+=3 ; 如果有临界保护,结果是 K 数值增加5,是正确的。如果没有临界保护,K的数值有可能就增加2 ,加3的操作被覆盖。

点评

你说的问题很好,这其实涉及到两方面的问题,一个是全局变量写访问,一个是全局变量自运算。 1、如果是写访问的话,如果一条汇编指令能够完成写操作,那么它就是原子操作; 2、如果是自运算的话,那么通常只在两种  详情 回复 发表于 2023-10-24 00:36
回复

使用道具 举报 送花

5

主题

1206

回帖

4812

积分

荣誉版主

积分
4812
 楼主| 发表于 2023-10-24 00:36:08 | 显示全部楼层
本帖最后由 CosyOS 于 2023-10-24 02:23 编辑
fan*** 发表于 2023-10-23 23:37
关于单字节变量的原子操作问题,我之前的想法和你是一样,后来发现这种想法也是不对的。比如,有一个单字 ...

你说的问题很好,这其实涉及到两方面的问题,一个是全局变量写访问,一个是全局变量自运算

1、如果是单纯的写访问,如果一条汇编指令能够完成最终的写操作,那么它就是原子操作,无论它费了多大的功夫去寻址。


2、如果是自运算的话,那么通常只在两种情况下会是原子操作:
(1)51/251,data上的单字节变量的自加一或自减一,编译后会使用INC、DEC指令,直接在data上运算,一步完成,是原子操作;
(2)GNU的全局寄存器变量自运算,会在寄存器上直接运算,一般也是原子操作。

3、其它的全局变量自运算,则一般都不是原子操作,原因是整个自运算的过程要分为  (读到寄存器中)、运算(写回全局变量),

共三步,这三步是一个整体不可分割,一旦被打断,其它的任务或中断又写了它或对它做了自运算,就会出错。

4、上述只是在一般情况下,并非绝对,最终需查看反汇编代码,看整个自运算过程的汇编指令是否只有一条指令,才能100%的确定是否是原子操作。

5、最后再补充一点,什么是自运算:
常见的自运算包括:++、--、/=、*=、%=、+=、-=、<<=、>>=、&=、^=、|=,及它们的展开式,如 i = i + 5,  i = i << 8  等。








回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-21 01:09 , Processed in 0.073994 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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