平台:GCC + STM32L476 有时为了扩展系统功能, 但又不想重新编译整个rtos系统, 这个时候就想单独编译一个位置无关的可执行代码。通过蓝牙或者串口什么的传输到设备上,然后拷贝到内存,直接运行, 这样就比较方便灵活, 不用每次为了更新一点东西而重新编译整个系统,还得重新烧录系统。 但是测试时总是报错,不清楚什么原因, 请各位高手,帮忙看看。 //1. 测试代码test.c: void main( void (*pFunc)(void) ) { pFunc(); } //2.编译为位置无关的可执行代码 arm-none-eabi-gcc.exe -O3 -fpic -mthumb -mcpu=cortex-m4 -mlittle-endian -c test.c arm-none-eabi-ld.exe -e main test.o -o test.elf arm-none-eabi-objcopy.exe -O binary test.elf test.bin arm-none-eabi-objdump.exe -D -f -b binary -m arm test.bin > test.dis //3.test.bin反汇编内容 test.bin: file format binary architecture: UNKNOWN!, flags 0x00000000: start address 0x00000000 Disassembly of section .data: 00000000 <.data>: 0: bf004700 svclt 0x00004700 //4.在系统软件里模拟加载test.bin到内存, 然后跳转执行。 uint8_t test_bin_data[] = {//test.bin的内容 0x00, 0x47, 0x00, 0xBF //其实就是一条跳转指令 }; void test_printf(void) { debug_printf("hello world\r\n"); } typedef void (*pRunMain)( void (*pFunc)(void) ); //跳转到test.bin所在内存地址运行 pRunMain pRun = (pRunMain) &test_bin_data[0]; pRun(test_printf); //运行时报HardFaultException错误 从汇编代码来看 是一条svclt指令, 如果编译时不指定-mthumb -mcpu=cortex-m4 , 编译后就是一条arm的跳转指令"bx r0", 不清楚cortex-m4 的svclt指令有什么特别的, 是否还需要修改SVC中断? |
已解决 |