FreeRTOS学习-02-读懂汇编代码

这篇博客介绍了如何读懂FreeRTOS中的内联汇编代码,特别是startup.s文件。作者建议准备相关手册,如ARM架构参考手册和GNU Assembler用户手册,并通过这些资源解析汇编代码。博客内容包括了数据段的初始化、BSS段的清零以及中断向量表的配置。
摘要由CSDN通过智能技术生成

FreeRTOS中有少量的内联汇编代码,并不复杂。

准备一些手册,搜索关键字就可以很快的找到有用的信息。

1.准备一些手册

ELF for the Arm Architecture

ARM v7-M Architecture Reference Manual

User Manual The GNU Assembler

GNU ld manual:

http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html

https://sourceware.org/binutils/docs/ld/

所有GNU的手册:

http://www.gnu.org/manual/

2.利用手册去读懂startup.s

startup.s要配合ld script文件一起读,可能还需要先读一下ELF for the Arm Architecture

/*注释的目的是看懂,之后在freertos里也有一些汇编代码*/
  .syntax unified
  .cpu cortex-m3
  .fpu softvfp
  .thumb

/*irq vector table and default handler*/
.global g_pfnVectors
.global Default_Handler

/* 指示data bss段的起始位置,赋值在ld script文件中*/
/* start address for the initialization values of the .data section.
defined in linker script */
/*_sidata要结合ld scatter/script文件来确定,实际上存储了data段在flash中的地址*/
.word _sidata
/* start address for the .data section. defined in linker script */
.word _sdata
/* end address for the .data section. defined in linker script */
.word _edata
/* start address for the .bss section. defined in linker script */
.word _sbss
/* end address for the .bss section. defined in linker script */
.word _ebss

/*BootRAM的值是0xF108F85F*/
.equ  BootRAM, 0xF108F85F
/**
 * @brief  This is the code that gets called when the processor first
 *          starts execution following a reset event. Only the absolutely
 *          necessary set is performed, after which the application
 *          supplied main() routine is called.
 * @param  None
 * @retval : None
*/
/*这个text.Reset_Handler很有迷惑性,它就是一个段名,在ld script中有 *(.text*)*/
  .section .text.Reset_Handler
/*.weak 如果这个符号名没有被定义,那么就创建它*/
/*在quick referance没有的,要到GNU AS Manual搜索*/
  .weak Reset_Handler
/*设置Reset_Handler符号的类型为函数,也就是说Reset_Handler是函数的名字*/
  .type Reset_Handler, %function
/*.section定义了Reset_Handler所属的段,.weak和type定义了它的属性*/
Reset_Handler:

/* Copy the data segment initializers from flash to SRAM */
/*汇编指令的语法和功能要参考对应的指令集,简单的就不再注释*/
/*这段代码是未后面的代码完成必要的初始化工作,所以并没有出现压栈和出栈操作*/
  movs r1, #0 /*r1=0,r1是传递给LoopCopyDataInit的一个参数,可以查询APCS*/
  b LoopCopyDataInit /*b即branch,所以接下来跳转到LoopCopyDataInit标号执行*/

C

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS Letter-shell 是一个基于 FreeRTOS 的命令行界面工具,可以方便地在嵌入式系统中进行调试和控制。下面是 Letter-shell 的代码实现。 首先,需要定义一些宏和数据结构: ```c #define MAX_COMMAND_LENGTH 50 #define MAX_NUM_PARAMS 10 #define MAX_OUTPUT_LENGTH 200 typedef struct { char command[MAX_COMMAND_LENGTH]; char params[MAX_NUM_PARAMS][MAX_COMMAND_LENGTH]; int num_params; } command_t; ``` 其中 `command_t` 结构体用于保存用户输入的命令及其参数。 接着,需要定义一个任务函数来处理用户输入。该任务函数会不断地从串口读取用户输入,并解析出命令及其参数。然后根据命令执行相应的操作,并将结果输出到串口。 ```c void letter_shell_task(void *pvParameters) { char input[MAX_COMMAND_LENGTH]; command_t command; char output[MAX_OUTPUT_LENGTH]; while(1) { // 从串口读取用户输入 read_input(input, MAX_COMMAND_LENGTH); // 解析命令及其参数 parse_command(input, &command); // 根据命令执行相应的操作,将结果存储在 output 中 execute_command(&command, output, MAX_OUTPUT_LENGTH); // 输出结果到串口 write_output(output); } } ``` 其中 `read_input()` 函数用于从串口读取用户输入,`parse_command()` 函数用于解析命令及其参数,`execute_command()` 函数用于执行命令并生成输出结果,`write_output()` 函数用于将输出结果输出到串口。 最后,需要在 FreeRTOS 中创建 Letter-shell 任务。 ```c void main() { // 初始化串口 init_uart(); // 创建 Letter-shell 任务 xTaskCreate(letter_shell_task, "Letter-shell", 1024, NULL, 1, NULL); // 启动 FreeRTOS 调度器 vTaskStartScheduler(); } ``` 以上就是 FreeRTOS Letter-shell 的代码实现。开发者可以根据自己的需求修改代码,增加自定义命令及其操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值