找回密码
 立即注册
查看: 1414|回复: 26

寻找SDCC技术交流组织

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-8-6 21:56:16 | 显示全部楼层 |阅读模式
最近参加的嘉立创&STC的创意活动。 想用SDCC实现,中间遇到些问题。
SDCC的用户手册翻遍了也没实际搞明白;

大家如果有谁知道SDCC技术交流群,求推荐
不争是争
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2024-12-23 11:42:56

3

主题

28

回帖

154

积分

注册会员

积分
154
发表于 2024-8-7 14:09:03 | 显示全部楼层
这里就是,有啥问题这里问就行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2024-8-7 14:30:37 | 显示全部楼层
楼上所言极是,咱们论坛有好几位SDCC大神
热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2024-8-7 14:40:55 | 显示全部楼层
啥问题啥问题?发出来看看?
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-8-7 15:31:13 | 显示全部楼层
hsr*** 发表于 2024-8-7 14:40
啥问题啥问题?发出来看看?

就是搞不清楚sdcc在是如何对函数的参数,变量进行分配空间的。
我用的芯片是 生态城8h8k6。
有个lcd的驱动;
提示:?ASlink-Error-Could not get 99 consecutive bytes in internal RAM for area DSEG.
我注释调几个函数后就行了, 或者把这个函数定义成 可重入的也行。
想搞明白它是如何分配内存的。
用户手册将的内容似乎也生效;

代码在: https://gitee.com/dchuizi/temperature-and-humidity.git
大佬可以直接拉下来看看。
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2024-8-7 16:39:43 | 显示全部楼层
大*** 发表于 2024-8-7 15:31
就是搞不清楚sdcc在是如何对函数的参数,变量进行分配空间的。
我用的芯片是 生态城8h8k6。
有个lcd的 ...

非可重入函数,变量与“内存模式”有关。
small → idata区
medium → pdata区
large → xdata区
huge → 据说支持内存分页,其它和large大差不差,还没见过

可重入函数就简单多了,以8bit参数为例,
第一个参数:DPL
第二个参数:DPH
第三个参数:B
…………
倒数第二个参数:栈顶往下第二个
倒数第一个参数:栈顶往下第一个
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2024-12-23 11:42:56

3

主题

28

回帖

154

积分

注册会员

积分
154
发表于 2024-8-7 16:42:50 | 显示全部楼层
大*** 发表于 2024-8-7 15:31
就是搞不清楚sdcc在是如何对函数的参数,变量进行分配空间的。
我用的芯片是 生态城8h8k6。
有个lcd的 ...

与内存模式有关。看sdcc官方文档第3.15.1节《MCS51 Memory Models》
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-8-7 16:56:09 | 显示全部楼层
hsr*** 发表于 2024-8-7 16:39
非可重入函数,变量与“内存模式”有关。
small → idata区
medium → pdata区

这个用户手册中也是这么描述的,如果没有使用reentrant等默认就是不可重入的。
.mem 这个文件中的表是代表哪一部分内存?
我这个报错具体是哪些内容想在哪里申请连续的99byte申请不到呢?
还有这个.map 文件怎么看;
DSEG:是指的哪里,从哪里能看到;
类似的还有 OSEG, SSEG, XSEG。 等。
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-8-7 16:57:17 | 显示全部楼层
Tec*** 发表于 2024-8-7 16:42
与内存模式有关。看sdcc官方文档第3.15.1节《MCS51 Memory Models》

嗯, 这个地方看了好多遍了, 但是从编译产生的文件中没办法对映上。
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2024-8-7 17:46:19 | 显示全部楼层
本帖最后由 hsrzq 于 2024-8-7 18:12 编辑
大*** 发表于 2024-8-7 16:56
这个用户手册中也是这么描述的,如果没有使用reentrant等默认就是不可重入的。
.mem 这个文件中的表是代 ...

.mem文件文件本身就带详细说明,我觉得不用再解释了呀
  1. Internal RAM layout:
  2.       0 1 2 3 4 5 6 7 8 9 A B C D E F
  3. 0x00:|0|0|0|0|0|0|0|0|a| | | | | | | |
  4. 0x10:| | | | | | | | | | | | | | | | |
  5. 0x20:|T|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  6. 0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  7. 0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  8. 0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  9. 0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  10. 0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  11. 0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  12. 0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  13. 0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  14. 0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  15. 0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  16. 0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  17. 0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
  18. 0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| |
  19. 0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute
  20. Stack starts at: 0x21 (sp set to 0x20) with 222 bytes available.
  21. The largest spare internal RAM space starts at 0x9 with 23 bytes available.
  22. Other memory:
  23.    Name             Start    End      Size     Max     
  24.    ---------------- -------- -------- -------- --------
  25.    PAGED EXT. RAM                         0      256   
  26.    EXTERNAL RAM     0x0001   0x1e76    7798     8192   
  27.    ROM/EPROM/FLASH  0x0000   0x5136   20791    65535
复制代码


第二眼再看.map文件,你可以认为ASxxxx Linker为每一小节的起始,摘录一小段如下:
  1. ASxxxx Linker V03.00/V05.40 + sdld,  page 9.
  2. Hexadecimal  [32-Bits]
  3. Area                                    Addr        Size        Decimal Bytes (Attributes)
  4. --------------------------------        ----        ----        ------- ----- ------------
  5. SSEG                                00000021    000000DE =         222. bytes (REL,OVR)
  6.       Value  Global                              Global Defined In Module
  7.       -----  --------------------------------   ------------------------
  8.      00000021  __start__stack                     main
复制代码

1. Hexadecimal  [32-Bits]表示该段下的地址用32位十六进制表示
2. SSEG表示这是堆栈段(即Stack Segment)
3. 00000021是SSEG段的起始位置。因为栈只能在data/idata中分配,所以可以配合第一眼.mem看一下第0x20行第1列,正好是S起始位置,相符。
4. 000000DE是整个SSEG段的长度。起始位置0x21+0xde - 1 = 0xfe,再配合第一眼.mem看下S正好只到0xfe。(为什么要减1?因为0x21已经占了一个名额了)
5. 222. bytes是该段的总字节数,与000000DE是同一个意思
6. (REL,OVR)是该段的一些属性,略微有点复杂,不详说了
7. value下的00000021,这是在该段下分配的资源地址。根据所属段不同,资源可能是变量、常量、中断入口、函数入口等等
8. Global下的__start__stack,这是在该段下分配的资源名称。__start__stack是sdcc系统栈底变量(注意C语言中要用_start__stack,少一个下划线)
9. main是定义该资源的模块。



DSEG、SSEG、XSEG这些,你随便打开一个生成的ASM文件就能看到含义。

DSEG → internal ram data
SSEG → Stack segment in internal ram
XSEG → uninitialized external ram data

业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:41 , Processed in 0.194337 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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