以 FreeRTOSv202107.00 为例
编译, 生成log ,看 编译 了 20个文件, 然后link
-
RISC-V-Qemu-virt_GCC 工程相关C文件
-
RISC-V-Qemu-virt_GCC 工程 所有 文件
-
boot 调试平台搭建
1. make DEBUG=1
2. qemu-system-riscv32 -nographic -machine virt -net none \
-chardev stdio,id=con,mux=on -serial chardev:con \
-mon chardev=con,mode=readline -bios none \
-smp 1 -kernel ./build/RTOSDemo.axf -S -s
3. riscv64-unknown-elf-gdb -tui build/RTOSDemo.axf
target remote localhost:1234
我现在用的编译器 是 ~/x-tools/riscv64-unknown-elf/bin/riscv64-unknown-elf-gcc , https://blog.csdn.net/u011011827/article/details/120086961 文章中 编译的 工具链
无法 debug 汇编,通过以下命令,在 gdb 中没有找到 start.S
(gdb) set logging file log_xxxxxxx
(gdb) set logging on
(gdb) info sources
(gdb) set logging off
看来是不支持 汇编 的
看来是无法通过 gdb 看出来了
但是是可以 调试 .c 文件的
后来发现, 哈哈哈, 是 编译汇编的 时候 没有 加 -g , 加上就可以了
- RISC-V-Qemu-virt_GCC 的启动流程
boot 调试平台搭建 搭建好后, 可以直接用 这个平台 调试
b _start 然后单步
FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/start.S
_start:
jal main
FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/main.c
main
vSendString( "Hello FreeRTOS!" );
xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );
xTaskCreate( prvQueueReceiveTask, "Rx", configMINIMAL_STACK_SIZE * 2U, NULL, mainQUEUE_RECEIVE_TASK_PRIORITY, NULL );
xTaskCreate( prvQueueSendTask, "Tx", configMINIMAL_STACK_SIZE * 2U, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );
vTaskStartScheduler();
- FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/start.S 做了什么
1. 设置 gp
2. 处理多核的问题,让其他的核心跑 secondary
3. 设置 sp
4. 设置 _data_lma // 将 _data_lma 中的 32(_edata-_data)个 字节 搬移到 _data
5. 清0 bss 段 : _bss - > _ebss
6. 跳转到main
---
// _data_lma 中的内容
(gdb) x/8xw 0x800029f0
0x800029f0: 0x00000006 0x00000000 0x80080100 0x00000000
0x80002a00: 0x0000ea60 0x00000000 0x80093f40 0x00000000
// 填充后的 _data的内容
// 即 uxTopUsedPriority 一开始为 0 ,运行时被填充
(gdb) x/8xw 0x80080000
0x80080000 <uxTopUsedPriority>: 0x00000006 0x00000000 0x80080100 0x00000000
0x80080010 <uxTimerIncrementsForOneTick>: 0x0000ea60 0x00000000 0x80093f40 0x00000000