Tag: 嵌入式

实现可以将提示视为实际语句吗?

在C中, register存储限定符是对实现的暗示 ,应尽可能快地访问此标识符(例如,存储在CPU寄存器中)。 §6.7.1具有存储类说明符寄存器的对象的标识符声明建议尽可能快地访问对象。 这些建议有效的程度是实施定义的。 和 §6.7.3限制限定符的预期用途(如寄存器存储类)是为了促进优化[…] 但是,我听说过register具有更强意义的实现(特别是嵌入式系统中的实现):它是一个命令 ,编译器应将限定标识符放在寄存器中。 那么, 是否允许实现遵循该行为并因此被视为符合标准? 什么会允许? 我提出这个问题是因为我发现有必要将该物品放在登记册中,这不再是标准规定的建议; 换句话说,他们发生冲突。

嵌入式系统上的C ++动态代码注入

我正在寻找以下问题的解决方案: 开发了一个在嵌入式设备上运行的C ++软件模块(不可能使用基于文件的函数“dlopen”来加载共享库),而模块运行时它应该可以通过动态程序代码进行扩展 动态代码在PC系统上编写(接口函数的实现)和交叉编译(gcc),然后通过总线系统发送到在嵌入式设备上运行的先前描述的软件模块 嵌入式设备上的软件模块应将接收到的动态程序代码保存在存储器中,并且应该能够调用其中的function 我该如何解决这个问题? 我的第一种方法如下: 交叉编译并将动态代码链接为PC端的共享库(ELF文件) (传输后)ELF文件在内存中的嵌入式设备上可用 重新定位ELF文件 – >这里我目前完全不知道如何制作! 有免费的图书馆来执行这种任务吗? 我不知道我的ELF文件方法是否可行? 如果是这样,我应该如何执行库重定位? 有没有更好/不同的方法来解决我的问题?

未定义的引用`kill’

我在C中开发了一个ARM7嵌入式系统的应用程序。现在我想用C ++编译和链接它以便使用一些C ++特性。 为此,我使用的是mipsel-elf-g++而不是mipsel-elf-gcc 。 我可以使用mipsel-elf-g++成功编译我的代码,但在链接步骤中我得到错误: /opt/mipsel/lib/gcc/mipsel-elf/3.4.6/../../../../mipsel-elf/lib/libc.a(lib_a-abort.o):在函数“`abort’: /cygdrive/d/Files/cross/mips/newlib-1.15.0/newlib/libc/stdlib/abort.c:63: undefined reference to d/Files/cross/mips/newlib-1.15.0/newlib/libc/stdlib/abort.c “`abort’: /cygdrive/d/Files/cross/mips/newlib-1.15.0/newlib/libc/stdlib/abort.c:63: undefined reference to _exit’` /opt/mipsel/lib/gcc/mipsel-elf/3.4.6/../../../../mipsel-elf/lib/libc.a(lib_a-signalr.o):在函数“`_kill_r’: /cygdrive/d/Files/cross/mips/newlib-1.15.0/newlib/libc/reent/signalr.c:61: undefined reference to kill’` collect2:ld返回1退出状态 我搜索了这个问题,发现我应该实现自己的_exit和kill函数,所以我将这些代码添加到我的项目中: void _exit(int code) { while(1); } int _DEFUN (kill, (pid, sig), int pid _AND int sig) { if(pid == __MYPID) _exit(sig); return 0; } 通过添加这两个函数,对“_exit”错误的未定义引用是固定的,但对“kill”错误的未定义引用仍然存在。 我该怎么做才能解决这个问题?

arm-none-eabi-ld:找不到-lc

我正在尝试为基于XMC1100的开发板编写代码。 我正在尝试这个教程: http : //eleceng.dit.ie/frank/arm/BareMetalXMC2Go/index.html 我已经下载了blinky.tar.gz文件并解压缩。 当我尝试“make”时,我收到了这个错误:arm-none-eabi-ld:找不到-lc 这是“make”的输出 arm-none-eabi-gcc -c -mcpu=cortex-m0 -mthumb -g init.c -o init.o arm-none-eabi-gcc -c -mcpu=cortex-m0 -mthumb -g main.c -o main.o arm-none-eabi-ld init.o main.o -L /usr/lib/gcc/arm-none-eabi/4.8.2/armv6-m -T linker_script.ld -lc –cref -Map main.map -nostartfiles -o main.elf arm-none-eabi-ld: cannot find -lc make: *** [main.elf] Error 1 我正在使用Linux Mint 17 Qiana 我错过了什么? 这是我的makefile: LIBSPEC=-L /usr/lib/gcc/arm-none-eabi/4.8.2/armv6-m […]

multithreading嵌入式软件中的primefaces操作

我一直在用C开发基于RTOS的嵌入式软件,我遇到了几个线程共享资源访问的问题。 我有两个问题。 第一个是在状态机中设置和获取状态变量的值。 下面是StateMachine“object”的头文件: typedef enum{ STATE_01, STATE_02, STATE_03, STATE_04 }state_e; // state machine instance typedef struct{ state_e currState; }StateMachine; extern state_e GetState(StateMachine*); extern void SetState(StateMachine*, state_e); 访问方法的实现如下: state_e GetState(StateMachine *sm){ return sm->currState; } void SetState(StateMachine *sm, state_e state){ sm->currState = state; } 我的问题是我不确定是否应该使用互斥锁来控制对状态变量的访问。 我的意思是在32位MCU上读取和写入32位变量是primefaces操作。 第二个问题涉及读取包含无符号32位整数的数组的一个项的值,其中每个位存储一位变量的值。 在这里,我不确定是否有必要使用互斥锁。 出于与上述相同的原因,我认为没有,但我想听一些更有经验的程序员的意见。 位数组“对象”的关联头文件: typedef struct{ uint32_t BitsArray[NO_WORDS]; }BitsArray; extern […]

printf()导致乱码

我有这个代码: unsigned char *command = “0000”; unsigned char foo = (hex_char_to_int(command[0]) << 4) | hex_char_to_int(command[1]); unsigned char bar = (hex_char_to_int(command[2]) << 4) | hex_char_to_int(command[3]); printf("foo: %02x, bar: %02x\r\n", foo, bar); 它使用此function: unsigned char hex_char_to_int(unsigned char ch) { switch (ch){ case ‘0’: return 0; case ‘1’: return 1; case ‘2’: return 2; case ‘3’: return 3; […]

状态机没有function指针

我已经实现了一个复杂的状态机,具有许多状态转换,用于安全SIL 4系统。 此实现的后骨是使用函数指针完成的。 当一切顺利航行时,V&V反对在SIL 4系统中使用function指针。 参考 – 规则9 NASA .Misra C 2004然而并没有说不能使用函数指针。 有没有其他方法可以在没有任何函数指针的情况下实现复杂的状态机?

C / C ++链接器CALL16在xxxxx处重定位而不是全局符号

我在链接时遇到这些错误,这两个消息都与同一个目标文件有关。 CALL16 reloc at 0x5f8 not against global symbol 和 could not read symbols: Bad value 第二条消息似乎是我收到CALL16错误的原因,但文件编译得很好。 有关修复此问题的提示吗? 仅供参考,我正在为MIPS目标进行交叉编译并使用gcc 4.1.2 编辑:到目前为止没有运气: 以下是我使用的标志:-fPIC,-Wl,-rpath,-Wl,-O1 我也试过以下没有成功: -mno-显式relocs -mexplicit-relocs -mlong通话 -mno长通话 -mxgot -mno-xgot 与此同时,我将在此时回到源头并进行更多调查。

C代码中MAC地址的表示

我经常在C代码中看到MAC地址的这种表示: struct mac_addr { unsigned char bytes[6]; } 为什么必须在一个结构中放一个数组,为什么不只是有一个数组呢? 这提供了什么好处? 谢谢。

Arduino中断替代方案

从我所读到的,我的问题的解决方案是使用中断,但如果我正确理解它,我不能在中断调用的例程中使用延迟。 我有一个大按钮LED开关。 我希望它在闲置时有一个心跳,但是一旦它被按下,保持绿色并执行代码。 如果我按下按钮足够次,我可以打破heartbeat() (我假设在正确的时间完成状态更改,因为它完成了heartbeat的循环),但我仍然坚持如何让它在第一次工作单击。 有没有其他方法来做我正在尝试的事情? void loop(){ heartbeat(); //Make LED beat. buttonVal = digitalRead(buttonPin); //Check the button. if (buttonVal != buttonState) { //If the button state changed. if (buttonVal == HIGH){ //Check if the button is pressed. analogWrite(greenPin, 255); //Button stays green once pushed. functionA //Has some delays in it. functionB //Has some other […]