寻找SDCC技术交流组织
最近参加的嘉立创&STC的创意活动。 想用SDCC实现,中间遇到些问题。SDCC的用户手册翻遍了也没实际搞明白;
大家如果有谁知道SDCC技术交流群,求推荐
这里就是,有啥问题这里问就行{:4_200:} 楼上所言极是,咱们论坛有好几位SDCC大神 啥问题啥问题?发出来看看? hsrzq 发表于 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
大佬可以直接拉下来看看。 大锤子 发表于 2024-8-7 15:31
就是搞不清楚sdcc在是如何对函数的参数,变量进行分配空间的。
我用的芯片是 生态城8h8k6。
有个lcd的 ...
非可重入函数,变量与“内存模式”有关。
small → idata区
medium → pdata区
large → xdata区
huge → 据说支持内存分页,其它和large大差不差,还没见过
可重入函数就简单多了,以8bit参数为例,
第一个参数:DPL
第二个参数:DPH
第三个参数:B
…………
倒数第二个参数:栈顶往下第二个
倒数第一个参数:栈顶往下第一个 大锤子 发表于 2024-8-7 15:31
就是搞不清楚sdcc在是如何对函数的参数,变量进行分配空间的。
我用的芯片是 生态城8h8k6。
有个lcd的 ...
与内存模式有关。看sdcc官方文档第3.15.1节《MCS51 Memory Models》 hsrzq 发表于 2024-8-7 16:39
非可重入函数,变量与“内存模式”有关。
small → idata区
medium → pdata区
这个用户手册中也是这么描述的,如果没有使用reentrant等默认就是不可重入的。
.mem 这个文件中的表是代表哪一部分内存?
我这个报错具体是哪些内容想在哪里申请连续的99byte申请不到呢?
还有这个.map 文件怎么看;
DSEG:是指的哪里,从哪里能看到;
类似的还有 OSEG, SSEG, XSEG。 等。 TechQI 发表于 2024-8-7 16:42
与内存模式有关。看sdcc官方文档第3.15.1节《MCS51 Memory Models》
嗯, 这个地方看了好多遍了, 但是从编译产生的文件中没办法对映上。 本帖最后由 hsrzq 于 2024-8-7 18:12 编辑
大锤子 发表于 2024-8-7 16:56
这个用户手册中也是这么描述的,如果没有使用reentrant等默认就是不可重入的。
.mem 这个文件中的表是代 ...
.mem文件文件本身就带详细说明,我觉得不用再解释了呀
Internal RAM layout:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0x00:|0|0|0|0|0|0|0|0|a| | | | | | | |
0x10:| | | | | | | | | | | | | | | | |
0x20:|T|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| |
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute
Stack starts at: 0x21 (sp set to 0x20) with 222 bytes available.
The largest spare internal RAM space starts at 0x9 with 23 bytes available.
Other memory:
Name Start End Size Max
---------------- -------- -------- -------- --------
PAGED EXT. RAM 0 256
EXTERNAL RAM 0x0001 0x1e76 7798 8192
ROM/EPROM/FLASH0x0000 0x5136 20791 65535
第二眼再看.map文件,你可以认为ASxxxx Linker为每一小节的起始,摘录一小段如下:
ASxxxx Linker V03.00/V05.40 + sdld,page 9.
Hexadecimal
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
SSEG 00000021 000000DE = 222. bytes (REL,OVR)
ValueGlobal Global Defined In Module
------------------------------------- ------------------------
00000021__start__stack main
1. Hexadecimal表示该段下的地址用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