小编jka*_*yca的帖子

链接器脚本中的Make或Shell变量

链接器脚本是否可以访问makefile/shell变量并根据所述变量做出决定?

例如,假设我想在不使用不同的链接描述文件的情况下更改下面RAM区域的开头,是否可以使用make变量来执行此操作?

MEMORY
{
ifeq ($(SOME_VAR),0)
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K
else
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K
endif
}
Run Code Online (Sandbox Code Playgroud)

linker makefile

9
推荐指数
2
解决办法
1746
查看次数

静态定义的IDT

我正在开发一个具有严格启动时间要求的项目.目标体系结构是基于IA-32的处理器,以32位保护模式运行.确定可以改进的一个领域是当前系统动态初始化处理器的IDT(中断描述符表).由于我们没有任何即插即用设备且系统相对静态,我希望能够使用静态构建的IDT.

然而,由于8字节中断门描述符分割ISR地址,这证明对于IA-32拱是麻烦的.ISR的低16位出现在描述符的前2个字节中,其他一些位填充接下来的4个字节,最后ISR的最后16位出现在最后2个字节中.

我想使用const数组来定义IDT,然后简单地将IDT寄存器指向它,如下所示:

typedef struct s_myIdt {
    unsigned short isrLobits;
    unsigned short segSelector;
    unsigned short otherBits;
    unsigned short isrHibits;
} myIdtStruct;

myIdtStruct myIdt[256] = {
    { (unsigned short)myIsr0, 1, 2, (unsigned short)(myIsr0 >> 16)},
    { (unsigned short)myIsr1, 1, 2, (unsigned short)(myIsr1 >> 16)},
Run Code Online (Sandbox Code Playgroud)

等等

显然这不起作用,因为在C中执行此操作是非法的,因为myIsr不是常量.它的值由链接器解决(只能进行有限的数学运算)而不是编译器.

关于如何做到这一点的任何建议或其他想法?

谢谢,

x86 interrupt isr

7
推荐指数
1
解决办法
553
查看次数

Newlib的替代品?

我是一名使用IA-32型处理器的嵌入式软件工程师.我们正在寻找一个编译工具链 - 更好的免费.

我们曾经使用Mentor Graphics CodeBench Lite,但它已不再可用.

我们已经查看了其他GCC发行版,但它们都没有glibc的裸机实现.除了newlib之外没有,但由于GPL和LGPL许可问题,我们无法使用它.我们是OEM,我们的客户(和我们)拥有专有代码.

欢迎任何建议.

embedded x86 gcc bare-metal newlib

4
推荐指数
1
解决办法
2438
查看次数

标签 统计

x86 ×2

bare-metal ×1

embedded ×1

gcc ×1

interrupt ×1

isr ×1

linker ×1

makefile ×1

newlib ×1