问题标签 [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.
assembly - 获取 16 位字的低位和高位部分
学习SDCC编译器,它的Z80部分(sdasz80)。在本机版本的汇编程序中,我使用:
将 16 位值存储BUF
在两个 8 位部分(高位和低位)中。我在 SDCC 中找不到怎么做,看来这个
编译没有错误,生成的代码是正确的,但是第二次加载对我来说看起来不太好,并且编译器不接受用于排序逻辑操作的括号。是否正确,并且是实现将 16 位值拆分为 2 个字节的唯一方法?
更新。可在一些 ASxxx手册 >
和<
操作员中找到(见表 4)。不要给出编译错误“错误:机器特定寻址或寻址模式错误”。
更新1:以下代码
给出一个错误Error: <q> missing or improper operators, terminators, or delimiters
。
embedded - I2C 无法启动
我正在使用 stm8s 控制器和 SDCC 编译器。我正在将基于 SD130S7 I 2 C 的 RTC 与控制器连接。我在沟通过程中遇到问题。我觉得问题是我2C本身没有启动。
我正在使用 STM8S103 的开发板。
我检查了逻辑分析仪,发现 SDA 引脚上只有一个脉冲。
我很困惑为什么 SDA 有脉搏而 SCL 没有。(因为 SCL 是时钟,时钟应该首先出现)。
c - 如何在 sdcc 内联汇编中推送变量?
我有这个代码ThreadCreate()
:
这导致:
我不明白为什么。tmpPSW
定义明确,但 sdcc 抱怨。我在这里做错了什么?还有其他方法可以在 sdcc 内联汇编中推送 C 变量吗?
这也可能是相关的。生成的.asm
文件包含分配信息:
这是否意味着我的寄存器用完了?如果是这样,我应该如何减轻这种情况?
编辑:
来源ThreadCreate()
:
生成的程序集ThreadCreate()
:
c - SDCC 可以覆盖运营商吗?
我一直在尝试使用 SDCC 编译极其轻量级的 C 程序以在 TI83 计算器上运行(是的,你可以这样做)。作为一个旧计算器,它没有太多的 RAM 来存储程序,而且处理器非常慢。我编写的代码类似于*((char*)(x/8)) |= 0x80>>(x&7)
一个简单的例程来打开 x 是有符号字符的单个位。问题是,SDCC 实现了将所有内容向上转换为 16 位整数的 C 标准,这增加了一层复杂性,然后它错过了 x/8 可以通过位移来实现的事实,并实现了整个内联除法算法。
我的问题是:我可以重新定义算术运算符以避免在可能的情况下向上转换吗?也许其次,我可以定义一次除法操作,然后多次调用它以避免大量文件吗?
编辑: 我意识到我的代码引起的很多问题都存在于相关变量的类型中,因为只有无符号除法才能进行这种优化。重新定义操作员并将操作转移到单独的单一位置的问题仍然存在。
compilation - 如何在指针中处理 8051 XDATA 内存空间?
我正在为包含 8051 内核的 Cypress EZ-USB FX2LP 进行开发,并且我使用 SDCC 进行编译。
我注意到我可以(有时?)省略__xdata
指针注释,即使使用指向 XDATA 区域的指针,我的固件仍然可以正常运行。
例如,它将使用以下声明编译和执行:
代替
据我了解,XDATA 是 16 位可寻址的,而 DATA 是 8 位可寻址的。当 SDCC 编译器可以指向 XDATA 时,它们是否会自动将指针提升为 16 位?
c - 浮点数及其对 8 位微控制器内存的影响
我目前正在开发一个项目,该项目包括在 stm-8 微控制器上使用 linux 中的 SDCC 编译器进行裸机编程。芯片中的内存非常低,所以我试图保持精简。我已经使用了 8 位和 16 位变量,一切都很顺利。但最近我遇到了一个问题,我真的需要一个浮点变量。因此,我编写了一个函数,该函数将 16 位值转换为浮点数,并执行我需要的数学运算并返回一个 8 位数字。这导致我在 MCU 上的最终编译代码从 1198 字节变为 3462 字节。现在我明白了使用浮点是内存密集型的,并且可能需要调用许多函数来处理浮点数的使用,但是将程序的大小增加这么多似乎很疯狂。
规格:MCU stm8151f2 编译器:带有 --opt_code_size 选项的 SDCC
c - STM8L051F3 GPIO 初始配置
我正在为一个简单的应用程序编写 STM8L051F3 处理器,其中只需要控制所有 GPIO。
问题是我无法控制 GPIOC 引脚 0。
我刚刚配置了 GPIO 寄存器。是否需要其他启动?
我还尝试在 Ubuntu 上使用 stm8cubemx。我发现没用的软件,因为它生成的 ioc8 文件没有关于如何在 Ubuntu 中使用它的信息。
终端命令。
编译 sdcc -lstm8 -mstm8 --opt-code-size --std-sdcc99 --nogcse --all-callee-saves --debug --verbose --stack-auto --fverbose-asm --float-reent - -no-peep -I./ -I./STM8S_StdPeriph_Driver/inc -D STM8L051 ./main.c
Prog stm8flash -c stlinkv2 -p stm8l051f3 -s flash -w main.ihx
c - 带有c语言的mcu 8051 ide sdcc编译器无法编译
我在使用 c 语言时遇到 MCU 8051 IDE 模拟器的问题,但是在我将 sdcc 编译器安装到我的电脑后但在我编写了 ac 程序并编译它之后,它会出现消息“没有 sdcc 编译器”。然后它来了这个消息
"sdcc -mmcs51 --iram-size 256 --xram-size 0 --code-size 8192 --nooverlay --compile-only --noinduction --std-sdcc89 --model-small "task1.1cpro.c" task1.1cpro.c:6:警告 94:由于数据类型范围有限,比较始终为真
找不到“task1.cdb”| +-- 很可能表明您已禁用调试开关,如果不是您想要的,请转到 [Main Menu] --> [Configure] --> [Compiler configuration] --> [C language] - -> [General] 并启用“--debug”编译器开关。"
怎么回事我找不到解决这个问题的任何建议............
arrays - 如何使用 SDCC 创建位域的打包数组?
我有一个包含位字段数组的嵌套数据结构,我需要使用 SDCC 为 MCS-51 目标编译这些位字段。
这是一个简化的例子:
example.c
由于struct data
包含 3 位,8 个实例总共包含 24 位,因此 3 字节的内存足以存储它们。
但是 SDCC 分配了 8 个字节,我们可以在结果中看到example.asm
:
有没有办法让 SDCC 只分配 3 个字节dummy
?
作为一种解决方法,我目前根本不使用 a struct
,而是使用一些宏来计算数据结构的总大小,分配一个平面字节数组,并生成索引和位掩码以访问各个成员。我想改用类似的语法dummy[5].b
。
一些编译器似乎有启用位域打包的选项(如#pragma pack
),但我在 SDCC 手册中没有找到类似的内容。
c - 为什么在声明之前没有主体调用此函数,“2”到底在做什么?
我正在调整一些代码以在 PIC18F47Q10 上以从模式运行 I2C。
该代码是为另一个类似的 PIC 编写的,但它确实需要一些调整。
这是原始代码:https ://github.com/texane/pic18f_i2c
在被定义之前我不明白这个电话,我也不明白'2'是什么意思。
这是来自int.c
原始发布的文件。任何帮助或解释表示赞赏。
现在我正在评论所有这些,并希望没有它也能正常工作。
看到的错误是: