Tag: arm

如何在Raspberry Pi上运行没有操作系统的C程序?

我想尝试将Raspberry Pi用于一些不同的低级嵌入式应用程序。 唯一的问题是,与可用的AVR和PIC微控制器板不同,Raspberry Pi通常运行一个操作系统(如Raspbian),它在所有正在运行的程序中分配CPU时间,并使其对某些实时应用程序不切实际。 我最近了解到,假设你有一个像GRUB一样的bootloader,在x86上运行一个C程序(以内核的forms)只需要很少的实际设置,只需要一个汇编程序来调用main函数和实际的C代码。 有没有办法用Raspberry Pi实现这一目标? 这是学习低级ARM编程的好方法,它已经有一些复杂的外围设备(USB,以太网等)

如何创建静态链接共享库

对于我的硕士论文,我正在尝试为ARM Cortex-M3嵌入式系统调整共享库方法。 由于我们的目标板没有MMU,我认为使用“普通”动态共享库是没有意义的。 因为.text是直接从flash执行的,并且.data在启动时被复制到RAM,所以我无法解决相对于代码的.data,因此GOT也是如此。 必须通过必须在链接时定义的绝对地址来访问GOT。 那么为什么不在链接时为所​​有符号分配固定的绝对地址……? 从“链接器和加载器”一书中我了解到“静态链接共享库,即库中程序和数据地址在链接时绑定到可执行文件的库”。 链接的章节描述了如何创建这样的库,并提供对Unix System V,BSD / OS的引用; 还提到了Linux和它的uselib()系统调用。 不幸的是,本书没有提供如何实际创建诸如工具和/或编译器/链接器开关之类的库的信息。 除了那本书之外,我几乎没有找到任何关于这些“野外”图书馆的信息。 我在这方面唯一发现的是Linux的预链接 。 但是,由于这是在“正常”动态库上运行,而不是我正在寻找的。 我担心这些库的使用非常具体,因此不存在创建它们的常用工具。 虽然在这种情况下提到的uselib()系统调用让我感到疑惑。 但是我想确保在开始破解我自己的链接器之前我没有忽略任何东西……;)那么有人能给我更多关于这些库的信息吗? 此外,我想知道是否有任何gcc / ld开关链接和重定位文件,但保留文件中的重定位条目 – 以便它可以重新重新定位? 我找到了“-r”选项,但完全跳过了重定位过程。 有没有人有想法? 编辑: 是的,我也知道链接器脚本。 使用gcc libfoo.c -o libfoo -nostdlib -e initLib -Ttext 0xdeadc0de我设法得到某种链接和重定位的目标文件。 但到目前为止,我还没有找到任何可能将主程序与此链接并将其用作共享库的可能性。 (链接动态共享库的“正常方式”将被链接器拒绝。)

如何在ARM上使用kgdb?

我使用ARMv7作为目标机器。 我已经为目标编译了Linux源2.6.34.13 。 Target使用minicom通过串口连接Host(Linux Development machine)。 Target加载了新内核,并在命令提示符下启用了KGDB。 $ echo ttyAMA0 > /sys/module/kgdboc/parameters/kgdboc $ echo g > /proc/sysrq-trigger 显示输入KGDB …消息并等待命令。 在主机方面 , $arm-none-linux-gnueabi-gdb vmlinux gdb > set remotebaud 115200 gdb > set debug remote 1 gdb > target remote /dev/ttyS0 在此之后,默认情况下会发生一些命令通信。 qSupported从Host发送到Target。 但目标不支持qSuppoted,因此返回$#00。 同样的? , HC-1命令已发送但收到适当的响应。 但qOffsets命令没有收到目标的任何响应。 我怀疑是vmlinux。 因为如果我在gdb中给出list ,它就不会显示10行代码 arch/arm/kernel/head.S : No such file or […]

使用动态库交叉编译C代码时出错

我有两个文件: lib.c #include void hi() { printf(“Hi i’m a library function in lib.so\n”); } 和main.c #include #include /* based on Jeff Scudder’s code */ int main() { void *SharedObjectFile; void (*hi)(); // Load the shared libary; SharedObjectFile = dlopen(“./lib.so”, RTLD_LAZY); // Obtain the address of a function in the shared library. ciao = dlsym(SharedObjectFile, “hi”); […]

如何将变量放在内存中的给定绝对地址(使用GCC)

RealView ARM C编译器支持使用at(address)的变量属性将变量放在给定的内存地址: int var __attribute__((at(0x40001000))); var = 4; // changes the memory located at 0x40001000 GCC是否具有类似的变量属性?

gcc结构中的内存对齐

我将应用程序移植到C中的ARM平台,该应用程序也在x86处理器上运行,并且必须向后兼容。 我现在有一些变量对齐的问题。 我已经阅读了__attribute__((aligned(4),packed))的gcc手册__attribute__((aligned(4),packed))我解释了所说的内容,因为struct的开头与4字节边界对齐,并且由于packed语句,内部保持不变。 最初我有这个,但偶尔它与4字节边界不对齐。 typedef struct { unsigned int code; unsigned int length; unsigned int seq; unsigned int request; unsigned char nonce[16]; unsigned short crc; } __attribute__((packed)) CHALLENGE; 所以我把它改成了这个。 typedef struct { unsigned int code; unsigned int length; unsigned int seq; unsigned int request; unsigned char nonce[16]; unsigned short crc; } __attribute__((aligned(4),packed)) CHALLENGE; 我之前说过的理解似乎是不正确的,因为结构现在都与4字节边界对齐,并且内部数据现在与4字节边界对齐,但由于字节顺序,结构的大小增加了大小从42到44个字节。 这个大小是至关重要的,因为我们有其他依赖于结构为42字节的应用程序。 […]

如何在ARM Cortex-A8处理器中测量程序执行时间?

我正在使用一个名为i.MX515的基于ARM Cortex-A8的处理器。 有Linux Ubuntu 9.10发行版。 我正在运行一个用C编写的非常大的应用程序,我正在使用gettimeofday(); 用于衡量我的应用程序所用时间的函数。 main() { gettimeofday(start); …. …. …. gettimeofday(end); } 这种方法足以让我看看我的应用程序块占用了多少时间。 但是,现在,我正在尝试使用gettimeofday()计算时间的方法彻底优化我的代码,我看到连续运行之间有很多波动(在我的优化之前和之后运行),所以我不能确定实际执行时间,从而影响我的改进。 谁能告诉我应该怎么做? 如果通过访问循环计数器( ARM网站上为Cortex-M3建议的想法 ),任何人都可以向我指出一些代码,它给出了我在Cortex-A8上访问定时器寄存器时必须遵循的步骤吗? 如果这种方法不是很准确,那么请提出一些替代方案。 谢谢 跟进 跟进1:在Code Sorcery上编写了以下程序,生成了可执行文件,当我尝试在主板上运行时,我得到了 – 非法指令消息:( static inline unsigned int get_cyclecount (void) { unsigned int value; // Read CCNT Register asm volatile (“MRC p15, 0, %0, c9, c13, 0\t\n”: “=r”(value)); return value; } […]