问题标签 [bare-metal]

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.

0 投票
3 回答
9300 浏览

c - 是否可以在 C 代码中将链接描述文件符号地址作为编译时间常数值?

我想获取程序结尾的地址,并在编译/链接器时检查我是否有足够的空间,在代码之后,在执行时放置一些随机数据。

但是由于 PROVIDE 关键字提供的符号就像 C 代码中的普通变量一样,我无法在编译时验证它。

在链接器脚本中,我有符号:

所以我可以使用这个符号来获取我的代码末尾的地址:

如果我假设结束地址为 0xffff,我可以计算可用内存:

我正在考虑使用 gcc 4.6 中提供的 _Static_assert(cond, message) 检查可用内存

我的问题是:宏 AVAILABLE_MEM 不是在编译时计算的,所以我得到了错误:

有没有办法直接在标签中或以其他方式提供 __data_end_rom 地址?

我知道我无法在编译时得到它,因为符号只会在链接器时被链接,所以有什么方法可以让链接器失败?

我可以直接在链接器脚本中检查这一点,但我不喜欢这样做,因为 SIZE_I_WANT_TO_ASSURE 是从配置头中的其他宏计算的另一个宏。

0 投票
2 回答
2987 浏览

gcc - 替代 Newlib?

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

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

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

欢迎任何建议。

0 投票
1 回答
973 浏览

c - 模拟器中运行时函数调用的ARM硬故障

我正在尝试为裸机(无操作系统)ARM Cortex M3 从 3rd 方源构建和运行一些项目。

我用 newlib 用 arm-none-eabi-gcc(success) 构建它。

我在 TI Code Composer Studio 的模拟器下运行它。

问题:

当我运行它时,它在第一次调用运行时库函数时出现硬故障(进入相应的 ISR)

直到现在我播种它在调用 memmove 或 memcpy 时失败。在跟踪反汇编时,我发现它完全按照指令失败

BLX 内存集

问题:什么可能导致故障以及如何调试它???

0 投票
2 回答
2972 浏览

arm - Entering sleep mode on arm cortex m4

I'm trying to put a cortex m4 processor to sleep for a little less than a second. I want to be able to tell it to sleep, then a second later, or when a button is pressed, pick up right where I left off. I've looked in the reference manual and VLPS mode looks like it would fit my needs. I don't know how to begin to enter that mode or how to program the NVIC.

More Info: I am doing this in C, on the bare metal.

0 投票
2 回答
7165 浏览

embedded - 将 pthreads 用于裸机的交叉编译程序

好的,这可能是一个非常笼统的问题,但我不熟悉这个话题并且很高兴得到任何提示。

我有一个来自 SoucereyCodeBench for ARM 的交叉编译工具链(arm-xilinx-linux-gnueabi-)。我交叉编译了一个使用编译器选项的库:-DSC_INCLUDE_FX -DSC_USE_PTHREADS -pthreads -fPIC -DPIC

因此,如果我想将库用于裸机程序,我猜我需要 pthreads 用于裸机编译器(arm-xilinx-eabi-)?

否则我的程序可能一开始就不会运行或编译。那么可以为裸机编译 pthread 吗?

0 投票
1 回答
1733 浏览

embedded - 启动裸机 ARM 应用程序时出现问题

我正在尝试使用 LLVM 为裸机 ARM Cortex M4 开发生成代码。IR 的创建进展顺利,LLVM 正在生成(在我看来)正确的 ARM Thumb ASM。

我购买了一个 Arm 开发套件来做一些测试:一个 Atmel SAM4L-EK http://www.atmel.com/tools/SAM4L-EK.aspx

我创建了一个打开开发板上黄色 LED 的应用程序。(我只是想从板上得到一些东西)我用 Atmel Studio 运行了一个包含的应用程序,并且 LED 工作正常。但我的应用程序似乎什么也没做......

根据手册,LED 连接到 PC10 在 ATSAM4LC4C MCU 的数据表中,它说 GPIO 端口的地址是 0x400E1000,一个端口占用 0x0200 字节的地址空间,因此端口 C 位于 0x400E1000 + 0x0400。

所以这是我的程序输出(LLVM 输出):

此代码将 GPIOEnableRegister 中的第 10 位设置为 1

然后将 OutputDriverEnableRegister 中的第 10 位设置为 1

然后将 OutputValueRegister 中的第 10 位设置为 1

此时 LED 应亮起...

这是我使用的启动代码:

两个汇编器文件都被编译成这样的目标文件:

使用 GNU ARM 汇编器

这是我使用的链接器脚本:

然后目标文件被链接到一个 ELF 二进制文件,如下所示:

使用 GNU Arm 链接器

然后我使用 Atmel Studio 将 ELF 二进制文件上传到开发板

机器人什么也没有发生(重置后也没有)

任何见解将不胜感激!

0 投票
0 回答
2738 浏览

assembly - 用于 ARMv8 基础模型的裸机上的 GNU 组装

ARM 发布了 ARMv8 仿真平台 Foundation Model。我根据linaro 网站上的指南设置环境。它可以支持裸机仿真,因为我尝试了示例 hello.axf 二进制文件

它正常退出到命令行提示符。我想编写一个可以在裸机上运行的最小汇编程序,但我不知道该怎么做。因此,我使用linaro armv8 工具链对 hello.axf 进行了反汇编,以寻找一些线索:

并获得退出子程序:

我编写了一个汇编文件 test.s ,其中仅包含退出片段:

并使用以下方法构建它:

运行它:

模拟器正在运行,但它不能像上面的 hello.axf 示例那样正常退出到命令行。对不起,冗长的描述。我的问题是如何在 ARMv8 Foundation Model 上编写一个最小的裸机组装程序。

0 投票
1 回答
966 浏览

c++ - C 环境初始化裸机 ARM GCC

我正在尝试让 C++ 项目在cortex-m0处理器上工作(nRF51822具体而言)。我正在使用 codesourcery lite g++ 2013.05.23。我正在使用 codesourcery (newlib) 和 CS3 c init 例程 __cs3_start_c 附带的 clib。我重写了 __cs3_restart 和 __cs3_start_asm 函数。

我可以使用 clib_init函数,它是从类似__libc_init_array. 当我在 address 执行指令时00012388,处理器出现故障。

由于这条指令是 a pop,我立即怀疑堆栈指针无效;但是,在故障之前捕获的寄存器值表明并非如此。任何想法为什么处理器出现故障?我可以做些什么来初始化 C++ 环境,以便我可以开始运行代码?

寄存器值:

我正在尝试编译的代码如下我没有任何静态分配的类,所以我不太明白为什么这段代码甚至在运行。



谢谢!

0 投票
3 回答
3240 浏览

c++ - CPU usage measurment on arm bare metal system

I am working on a ARM cortex M4 evaluation board, its a bare metal application without any operating system running on it.

Now I want to measure CPU usage of a given process/algorithm , what would be the best way to do so?

Should i implement an operating system to measure the CPU usage that have the functionality for such demand?

0 投票
0 回答
823 浏览

memory - 带有 MMU 的 ARM 裸机:连续读取产生不同的值

上下文(可能不需要):

作为一项学习练习,我正在尝试为 Raspberry Pi 实现一个迷你“操作系统”。

我目前正在实现一个非常愚蠢的内存管理系统。我已经启用了 MMU,并且正在获取可用的 kmalloc。

它已经可以从预先存在的小内核堆中分配内存块,映射在代码和数据段之后。我试图通过映射更多页面来让它根据需要增长。它还必须能够产生物理上连续的块。

该代码托管在Github上,有一个专门用于调试代码的分支。请注意,这不是一个组织良好、注释良好或非常聪明的代码的示例。:)

实际问题:

在尝试调试数据中止时,我发现了一些非常奇怪的东西。

这是我的 kmalloc 中的一段代码:

我跑了三遍。结果如下:

第一次和第三次迭代看起来很正常(虽然 next_free 的值应该是 0,但数据中止是因为它有 0xffffffff)。但是我的代码在第二个期间在做什么?O_o 什么样的黑魔法可以让我的 printf 在连续读取四次时为 chunk->next_free 输出两个不同的值?o_o

数据对齐良好,页面可缓存且不可缓冲(使它们不可缓存无济于事),无论编译器优化是打开还是关闭,我都会得到相同的结果。我尝试在那里设置数据内存屏障,但实际上它什么也没做。我还检查了生产的组件,它看起来没问题。

我认为这可能是由损坏的 TLB 引起的。我在每个新页面映射后发出“使统一单一条目无效”(mcr p15, 0, %[addr], c8, c7, 1)。够了吗?

我尝试使用 qemu 进行调试,但在设置已用物理页面的位图时,它会提前中止数据,尽管这部分在 Pi 上运行良好。

我只是在寻找可能导致这种行为的线索。如果您需要更多上下文,请询问,尽管我的代码目前正在迅速变化并且由于大量 printf 而变得混乱。


ETA:前两个 printf 使用 -O0 的反汇编:

所以它把chunkr3 的地址放进去,然后执行 aldr来获取next_free。它在第二个prinf之前再次执行此操作。只有一个内核,DMA 没有运行,所以在调用之间没有改变内存中的值。

使用 -O2:

所以它仍然用ldr. 这就是为什么我在两个优化级别都得到相同的结果。


新编辑:我添加了更多 printfs,似乎奇点发生在这一点上:

在这行之后,chunk->next_free 变成了海森堡的猫。之前,它读为 0。

结构定义如下:

chunk并且next不要重叠。

如果我将“奇点线”移到 下方next->next_free = chunk->next_free,它会停止在两个值之间交替,但这仍然很奇怪: chunk->next_free 之前为 0 *prev_list = next,之后为 0xffffffff 。但是 next->next_free 仍然设置为 0。