问题标签 [sdcc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
embedded - SDCC 代码银行
我需要在 8051 微控制器中使用代码库来适应所有代码。SDCC 说它支持它,但是我在链接步骤中遇到了麻烦。
我有一个包含 3 个文件的测试项目:main.c、func1.c 和 bank.asm。主函数应该调用 func1() 然后进入一个 while 循环。但 func1() 位于不同的代码库中。
我有一个构建批处理文件来编译所有内容并将它们链接在一起。
我收到此链接器错误:
我怎样才能得到这个链接?
embedded - 将编译后的程序上传到 C51 微控制器
我正在尝试将已编译的程序上传到微控制器..我的问题不在于编程或上传东西..我的问题是上传什么
该程序是 C 语言并使用 SDCC 编译的。单片机是 ATMEL 的 AT89S8252。
我按照数据表中所述的用于串行编程的 MCU 协议构建了一个简单的并行端口编程器。
到目前为止一切顺利.. 但是.. 我应该将什么上传到 mcu?
编译时,SDCC 会生成很多文本报告.. 然后是 .ihx.. 我怀疑我不应该直接上传这个文件,而是以某种方式对其进行后期处理以获取要上传的实际原始字节?
任何帮助将不胜感激 =)
c - 使用 SDCC (Little Endian) 编译器时这个算法有什么问题?
我是 C 编程的新手,我正在为我的 MCU 开发固件应用程序。当我使用 KEIL 编译器(Big Endian)时,此方法工作正常,但当我切换到 SDCC 编译器(Little Endian)时,它无法正常工作。有人可以解释我做错了什么吗???
目标设备是基于 8051 架构的 Silicon Labs C8051F320。
添加:首先,我现在将 MotorSteps 和 MotorSpeed 更改为无符号整数。 在我的调试器中,由于某种原因,如果我在 if 语句行设置断点,在此函数 MotorSteps = 00 的第一个入口处,因此 t 也应该分配为 0,但调试器显示 t=0.031497(十进制)。如果我将调试器切换为以十六进制显示,t = 0x3d010300。这就像 t 永远不会被分配......
c - 是否所有 C 编译器都允许函数返回结构?
我正在使用 C 语言编写程序,并将 SDCC 编译器用于 8051 架构设备。我正在尝试编写一个名为 GetName 的函数,该函数将从闪存中读取 8 个字符并以某种形式返回字符数组。我知道不可能在 C 中返回一个数组,所以我尝试使用这样的结构来完成它:
我还没有对这个函数的任何引用,但由于某种原因,我收到一个编译器错误,上面写着“函数无法返回聚合”。这是否意味着我的编译器不支持返回结构的函数?还是我只是做错了什么?
linker - 为什么在C程序中使用结构会导致链接错误
我正在为 8051 架构芯片和 SDCC 编译器编写 C 程序。
我有一个名为 FilterStructure 的结构;
我的代码看起来像这样......
出于某种原因,我收到链接错误“?ASlink-Error-Could not get 29 Continuous bytes in internal RAM for area DSEG”
如果我注释掉表明FilterStructure testStruct;
错误消失的行。
这个错误是什么意思?完成后是否需要丢弃结构?
c - 从 16 位地址中划分高/低字节的方法?
我正在 8051 处理器上开发软件。一个常见的工作是划分一个 16 位地址的高字节和低字节。我想看看有多少种方法可以实现它。到目前为止我提出的方法是:(说 ptr 是一个 16 位指针,而 int 是 16 位 int)[注意 rn 和 arn 是寄存器]
按位运算
SDCC 给出以下汇编代码
Keil C51 给了我: 其中有许多无用的代码恕我直言。指针技巧
SDCC 给了我: Keil C51 给了我: 这与 SDCC 版本相同。安德烈的数学方法
p>SDCC 给出:
我不知道为什么 sdcc 使用 r7 寄存器... Keil C51 给了我: 我不知道为什么 Keil 也不使用 R2 寄存器...semaj 的联合方法
p>SDCC 给了我
Keil C51 给了我: 这对指针技巧非常微笑。但是,这种方法需要多两个字节的内存来存储联合。有没有人有任何其他好的想法?;)
任何人都可以告诉我哪种方式更有效?
如果有人感兴趣,这里是测试用例:
}
c - 您如何控制 C 编译器优化的内容?
我正在使用 Silicon Labs IDE 和 SDCC 编译器用 C 语言为嵌入式设备编写固件。器件架构基于 8051 系列。有问题的函数如下所示。该功能用于设置我的 MCU 上的端口以驱动步进电机。它被中断处理程序调用。大开关语句只是将端口设置为下一个电机步进的正确值。该功能的底部查看来自霍尔效应传感器的输入和移动的步数,以检测电机是否已停止。问题是,由于某种原因,看起来像这样的第二个 IF 语句if (StallDetector > (GapSize + 20))
{
HandleStallEvent();
}
似乎总是被优化出来。如果我尝试在HandleStallEvent()
调用 IDE 会给我一条消息,说“与此行号没有地址相关性”。我不太擅长阅读汇编来了解它在做什么,但我从下面的 asm 输出中粘贴了一个片段。任何帮助将非常感激。
...以及此函数底部的 asm 输出...
在我看来,编译器没有从 asm 的外观优化第二个 if 语句,但如果是这种情况,为什么 IDE 不允许我在此处设置断点?也许这只是一个愚蠢的IDE!
makefile - 在链接步骤期间在 Makefile 中使用 SDCC 时出现问题
即使在链接步骤中存在未定义的参考错误,小型设备 C 编译器 (SDCC) 也会生成 ihx(英特尔十六进制)文件。在 Makefile 中使用 SDCC 时,此行为会导致问题,因为如果您将 ihx 文件设置为您的 make 目标,则 make 无法知道先前的链接尝试已失败。
当链接期间存在未定义的引用时,有没有办法告诉 SDCC 抑制 ihx 输出?如果没有,最好的解决方法是什么?(我已经想到了一个)。
另外,如果有人知道的话,我对为什么SDCC 是这样设计的很感兴趣。
这是问题的一个例子:
你有一个名为 test.c 的文件,它调用了一个未定义的函数:
您有一个简单的 Makefile 用于从 test.c 构建 test.ihx:
您第一次尝试编译 test.c 并失败:
您尝试通过更改不依赖于 ihx 的内容(例如 Makefile)来解决问题,然后尝试再次编译:
但是 make 不会尝试编译它,因为 SDCC 已经创建了 ihx 文件。
ide - 如何将 Silicon Laboratories IDE 与 SDCC 一起使用?
我正在考虑使用来自 Silicon Laboratories 的具有 8051 内核的微控制器。我希望我可以使用C而不是汇编语言,所以我安装了SDCC。
我安装了“Silicon Laboratories IDE”来将可执行二进制文件下载到片上闪存程序存储器中。它也可以设置(在项目>工具链集成菜单下)使用“任何”8051编译器。
我尝试将其设置为使用 SDCC,但每次我点击“汇编/编译文件”按钮时,它都会告诉我“编译器进程未成功完成”。
如何获得我在 SiLabs C8051F310 芯片上写入的新 C 代码?有没有一步一步的 HOWTO 网站?(使用调用 SDCC 的 MAKEFILE 会更容易吗,只使用“Silicon Laboratories IDE”将可执行二进制文件下载到芯片的最后一步?)
assembly - 在 Intel 8051 上结合 SDCC 和 ASM 代码编译的问题
我们正在尝试编译我们的 C 代码,其中包括用于各种操作(定时、产生输出波形和测量输入频率)的大量程序集。
对于我们的一些 ASM 操作,我们不断收到相同的错误:
“REL 区域中的 .org 或指令/助记符错误”
在下面的代码中,我们得到 3 个错误(我评论了它们发生的行,以及我们得到的错误究竟是什么。谢谢!