问题标签 [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.
c - 使用 GCC 编译时忽略 SDCC 编译器语言扩展
我正在尝试编译一些最初使用 GCC 为 SDCC 编写的 c 代码,以便在主机上运行一些单元测试。SDCC 有一些语言扩展,例如__xdata
or __pdata
(用于内存控制),它们应该保留给 SDCC,但在使用 GCC 编译时应该被忽略。我强烈不希望修改被测模块。有没有办法做到这一点?
我已经发现如果我#define __xdata
在被测模块中添加类似的东西,它会起作用。因此,也许有可能有类似“全局定义”的东西?我对 GCC 的经验很少。也许有编译器标志可以帮助我?
c - C 编程如何在没有标头的情况下工作?
我熟悉 C 编程语言和 z80 汇编,并且我制作了一个简单的 z80“计算机”,它只有 32k ram、32k rom 和 8255 pia 用于 io 控制的 cpu。我已经通过汇编语言子程序让 8255 与我的系统一起点亮 LED。
所以问题是:如果有SDCC(小型设备C编译器)可以将C程序编译成包括z80在内的各种小型CPU的汇编,如果没有stdio库或任何库,你如何创建C程序因为这个系统是多么的定制。我是否被迫先使用程序集,然后将函数作为 ASM 例程进行调用?我是否误解了某种关键思想?我很困惑这是如何工作的。我不能只在没有输出的系统上 printf()。更不用说 printf() 是假设终端以某种方式连接的。
cmake - Why is the toolchain file executed a few times in CMake?
In an attempt to create a cross-compilation CMake toolchain template with the SDCC compiler, I have come across a very weird issue.
As described in this link, if the toolchain.cmake
file defines a CMAKE_SYSTEM_NAME
, CMake will look for the file with the ${CMAKE_SYSTEM_NAME}.cmake
under the Module/Platform
directory. And this file should define platform-specific options. In my case, I am using it to find the sdcc
compiler and setting some compiler flags.
This works just fine for me. Using cmake -DCMAKE_MODULE_PATH="${PATH_TO_MY_MODULES}" -DCMAKE_TOOLCHAIN_FILE="${PATH_TO_MY_TOOLCHAIN}" -DSDCC_SYSROOT="SOME_VALUE"
, CMake finds all the correct toolchain and platform files.
It seems like the toolchain and the platform file are executed (not sure if that's the correct term) a few times during the configuration process. In the first few times, the variable SDCC_SYSROOT
I passed in the CMake command has the value SOME_VALUE
as expected. However, the same variable SDCC_SYSROOT
seems to lose the value in the last time these toolchain/platform files are executed. So they are empty. This causes my script to generate a fatal error.
toolchain.cmake
has the following contents:
the Module/Platform/SDCC_PIC_16F877A.cmake
file has the contents:
and my CMakeLists.txt
is the following:
what I invoke from my project/build
directory and the error I get:
Why do the toolchain files get "executed" more than once by CMake and has no access to cache in the latest runs? I've been finding CMake documentation for cross-compilation very difficult, especially if you are working with a non-standard compiler.
I am aware that other people have had same issues before, but I am not simply asking for a simple hacky solution (setting environment variables). I actually want to know why this happens (which the previous answers don't tackle).
c - SDCC 生成不必要的除以零
我正在使用 SDCC 为 STM8 微控制器进行编译。编译以下文件会导致看似不必要的div
指令——这在 STM8 上非常慢。
sdcc -mstm8 file.c
在以下程序集中编译结果:
该功能似乎按预期工作,但是我不明白为什么需要前两条指令。
keil - SDCC 和 Keil 在 8051 中具有相同代码的不同外观
我写了一个延迟函数:
但是当我通过 sdcc 和 keil 编译这段代码,并在 8051 芯片上运行时。结果就是sdcc编译的delay函数运行起来比keil编译的函数慢很多。
谁能告诉我为什么...
linker - SDCC Z80:避免地址
我可以在 SDCC 的代码段中排除某些地址吗?例如,如果我的代码段跨越 addr。0x0000 到 0x4000,我能以某种方式告诉链接器/编译器避免添加地址吗?从 0x2000 到 0x2100 并且不在那里放置任何代码?
两个实际案例是:
- 用新的(完全不同的!)版本替换 ROM,并希望保持与旧 ROM 的二进制兼容性。旧ROM中的某些绝对地址被现有软件调用,我想提供“兼容模式”,确保至少最常见的跳转仍然有效。
- 如果我“触摸”某些地址,则内存映射硬件会对 ROM 造成不利影响(例如禁用它!)。所以我想确保那里没有放置任何代码。
我可以创建多个段并手动为它们分配函数直到“满”,但我想知道我是否可以从编译器/链接器那里获得任何帮助?因为代码经常更改,我不想调整每个错误修复进入哪个段,这会增加几个字节的函数大小......
c - 如何将变量放在 SDCC 中的特定内存位置
对于低级编程,有时有必要说,在给定的内存位置,这是我的地址所在的位置。对于这篇文章,示例是PIR1
PIC16F886 和相关微控制器中的寄存器。它始终位于地址 0x000C。
我采用了这种方法:
现在我可以用类似的东西分配给变量pir1 |= 0x40
(好吧,我会使用#defined常量而不是幻数,但你明白我的意思)。这在 GCC 上编译得很好,即使我使用-Wextra -Wall
. 为了检查我的假设,GCC 吐出了以下 x86_64:
正是我想要的(好吧,我现在确定为什么它是eax
一个又rax
一个,这可能是另一个愚蠢的 x86 怪癖,但无关紧要,因为无论如何我都想要 PIC14 代码)
现在,以 PIC14 为目标,我实际上使用的是 SDCC 编译器。我像这样调用它
上面以开头的代码#define
给出了以下警告:
我试过这样做:
但这会导致错误消息
当我尝试分配任务时。
所以我的问题是我是否错过了在 C 中执行此操作的惯用方式?为什么 SDCC 会警告我?我在这里忽略了一些特定的 SDCC 特定的放克吗?
keil - sdcc 在 keil 中工作的代码上给出语法错误
我试图理解这段代码。它在一个教程中,我正在按照教程进行操作,所以我尝试了这段代码。
我使用 sdcc 编译它,但它在第 7 列给了我一个语法错误。
本教程显示代码在 keil 中工作。而且我发现你必须用 8051 头文件替换 reg51 头文件。但它仍然在第 7 列给出语法错误。
我不知道问题是什么。我什至无法开始理解它。
错误,
lcd.c:6: 语法错误: token -> 'rs' ; 第 7 栏
sdcc - 使用 -Wall 选项使用 SDCC 编译失败
我正在用 SDCC 编译一个 8051 项目,但有一个问题Makefile
,以下来源:
当我运行make
它有错误:
我怎样才能解决这个问题?
c - STM8L001J3 SDCC 和使用 STM 工具集刷新 s19 文件的问题
我刚刚开始将 STM8(一个 STM8L001J3,不幸的是开源工具链支持的最差)与 SDCC 一起使用。由于 ST Visual Programmer 只支持 s19,所以我需要选择这个作为输出格式。查看映射文件,一切似乎都很好,链接器将主函数放置在代码空间 0x8028 开头的稍微后面(就在中断向量后面)。
代码本身如下所示:
我什至设置--code-loc 0x8000
了链接器的选项以正确放置它,当我向 VSCode(带有 EIDE 扩展)询问命令行时,它告诉我以下信息:
当我现在在 ST Visual Programmer 中打开文件时,它会显示:
如果我生成一些英特尔 HEX 文件并将其放入http://www.dlwrr.com/electronics/tools/hexview/hexview.html的在线查看器中,它看起来也不错。
由于我不会流利地说摩托罗拉 s19,也许有人可以给我一个提示。
如果有人可以批准,十六进制很好并将我链接到一个编程工具,在 Windows (10) 上支持这个变体,这也是一个可行的解决方案。