问题标签 [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.
linux - 在嵌入式设计中,使用 linux 操作系统与直接针对 cpu 编程的实际开销是多少?
我知道这个问题的答案,像大多数人一样,是“视情况而定”,但我所寻找的与其说是答案,不如说是影响决定的不同事物的基本原理。
我的用例是我有一个运行嵌入式设备的 ARM Cortex A8 (TI AM335x)。我的选择是使用一些嵌入式 linux 来利用一些预构建的驱动程序和其他东西来加快开发速度,但我对这个项目最大的担忧是设备的速度。内存和磁盘空间不是什么大问题。我认为这是一个安全的假设,即直接针对 mpu 进行编程而不使用完整的操作系统肯定会使应用程序更快,但是获得 1% 或 2% 的加速并不值得额外的开发时间。
我想最大的减速将来自内核上下文切换和内存映射,但我没有正确评估或衡量这些减速程度的知识。任何指导将不胜感激!
linker-scripts - 如何从链接器命令文件中定义的符号中获取 18 位代码地址
在 Code Composer 中,您可以简单地在链接器命令文件中定义新符号:
在内存映射和部分分配之前。这是在 TI 的引导加载程序示例中完成的。
然后,您可以在 c 代码中引用地址(作为整数),如下所示
问题在于,如果您使用“小”内存模型,后一个符号(位于 0x45C00)会发出链接器警告,因为它会尝试将其转换为 16 位指针。
我尝试使用显式far
指针,但代码编写器不理解关键字far
. 我试图使虚拟符号成为函数指针,以欺骗编译器认为取消引用它会......指针指向代码空间,代码空间模型是“大”,而数据空间模型是“小” .
c - 使用工具链未定义对 strcmp 的引用
我正在尝试在树莓派上编写一个简单的裸机程序,但是当我尝试使用strcmp
时,出现以下错误:
这是我的制作文件:
docker - 裸机上的 Docker?
在 Docker 网站上,我看到在“裸机”上提到了 Docker。这是否意味着您可以在没有底层操作系统的硬件上运行 Docker?
如果是这样,人们将如何安装/实施它?
c - Bare-metal Loader - 通过共享内存将 .elf 二进制文件发送到其他处理器并执行
设置:一个运行busybox-Linux的ARM-CPU (A9)。这个与网络对话并获得一个预编译的静态链接精灵。第二个 CPU 运行裸机应用程序。我在那个上有newlib,整个“操作系统”都在内存中,只是执行那个基本程序。两者共享强迫症。
我已经成功地让两个处理器“说话”了。我可以从 linux 将十六进制值写入内存,其他处理器读取它,反之亦然。现在我想解析上述精灵,将其发送到 OCM,让裸机将其读入内存,通过 asm 设置程序计数器并执行所述精灵(也可以使用 .o 文件)。我已经被困在解析精灵了......
_asm-idea.S:
帮助我强大所以你是我唯一的希望。
timer - 在 BeagleBone Black 上设置快速 (DMTimer-) 中断
我尝试使用 StarterWare 在 Beaglebone Black 上进行一些裸机编程。与 Black 一起运行的所有修改都已完成,我正在运行运行良好的 DMTimer 示例。
在下一步中,我改变了这个例子,ISR 只是切换一个 GPIO(它应该只需要几十个时钟周期)。我将示例的计时器和计时器重新加载计数更改为 0xFFFFFF0F,它等于 10 微秒周期 - 所以我的 ISR 应该每 10 微秒调用一次。
令人惊讶的是,这似乎是极限,当我使用更大的计时器值时,这应该会导致更频繁地调用 ISR,它仍然停留在这 10 微秒,即使使用 DMTimer 示例也不可能达到 5 微秒。由于已经使用了定时器时钟源 CLK_M_OSC,所以这应该没问题。
那么......知道如何更快地调用 ISR 吗?
c - 如何构建 Lego MindStorm EV3 二进制文件?
我们正在尝试为ev3 乐高积木编写伪操作系统。我们已经知道,砖的 ROM 中有一个 u-boot 加载程序,它从 SD 卡的第一个分区加载一个uImage文件。我们试图了解Linux ev3 内核的工作原理以及入口点在哪里(假设main函数)。我们有一个潜在的入口点,但我们不知道如何将此位置标记为入口点或如何编写简化版本。
我们想创建自己的二进制文件,可以将其转换为uImage文件(使用mkimage)。
- 我们必须如何做到这一点?
- 如何将某个 C 函数标记为入口点?
c - 裸机臂 (AM1808) - 从 Kick Registers 读取
我试图在我的裸机 AM1808 上进行一些引脚复用,但我似乎无法编写 kick 寄存器?或者,更具体地说,我似乎无法读回我尝试写入的值。
这是我的代码:
输出:
尽管我处于超级用户模式,但我通常无法读取启动寄存器吗?如果是这样,我如何测试我是否正确解锁了 syscfg?
更新:事实证明,我遇到的问题与引脚复用或踢寄存器无关,而是在使用正确复用的 GPIO 引脚的顶层逻辑中出现错误。对困惑感到抱歉。
python - 使用 python 编写基于 linux 的树莓派操作系统
我对编写操作系统了解不多,但我认为这将是一个很好的学习方式。有树莓派操作系统的教程,但它们不是基于 linux 的,也不是用 python 制作的。我只是在这里寻找一般教程。
c - 如何将中断连接到 Raspberry Pi 的函数?
我正在编写一个简单的程序来测试 ARM 计时器和 Raspberry Pi 上的中断,运行裸机。使用 ARM 定时器 Masked IRQ 寄存器,我已验证定时器按预期工作并且中断实际上正在触发。这显示在下面的代码中。我没有包括寄存器地址定义,但如果有用的话我可以。
下一步是让函数 IRQHandler 实际处理中断。我如何向编译器表明这应该是一个中断服务程序?我正在使用 arm-none-eabi-gcc。
if(...
我已经尝试在 main() 中注释掉该行并在__attribute__ ((interrupt ("IRQ")));
之后添加void IRQHandler(void)
,但是在程序运行时永远不会调用 IRQHandler 函数。
我以前没有做过很多关于中断和 ISR 的工作,我非常感谢一些帮助!