06 2021 档案
摘要:当运行的程序在被停止住时,我们可以让其自动运行一些别的命令 用法:commands break_list例如: (gdb) commands 1 Type commands for when breakpoint 1 is hit, one per line. End with a line say
阅读全文
摘要:break if 用法:break [break-args] if (condition)例如: break main if argc > 1 break 180 if (string == NULL && i < 0) break test.c:34 if (x & y) == 1 break m
阅读全文
摘要:编译程序, gcc 需要加上 -g,才能用 gdb 调试程序,然后把优化等级设为 -O0 在 (gdb) 状态下直接回车,执行上一次命令 (gdb) help ;查看帮助文档 (gdb) shell 命令 ;可以在 gdb 调试环境下执行 shell 命令 程序执行控制 $ gdb ;进入 gdb
阅读全文
摘要:简而言之: CMSIS 定义了一套 API,应用层代码调用这套API。微控制器厂商完成 API 的实现。 CMSIS 项目仍在不断更新,它开始是为了 cortex-M 微控制器的设备驱动库建立一致性,现在已经成为了 CMSIS-Core,其他的 CMSISI 项目也已经启动: CMSIS-Core(
阅读全文
摘要:基本知识 证书生成网站:https://csr.chinassl.net/index.html 证书会包含一个服务器的域名,或者包含多个域名( 多域名证书,SAN certificater == SubjectAltName Certificater) 自签名证书:正常情况是把 “ 证书请求文件 ”
阅读全文
摘要:subject alt name: 对于证书持有者,一般使用 Subject 项标记,并使用 subjectAltName 扩展项提供更详细的持有者身份信息。 subjectAltName 全称为 Subject Alternative Name,缩写为 SAN。它可以包括一个或者多个的电子邮件地址
阅读全文
摘要:源文件到可执行文件流程 编译:.c 文件变成 .s 汇编文件 汇编:.s 文件变成 .o 可重定位的目标文件(elf格式文件) 链接:一个或多个.o 文件变成一个可执行文件 ELF 文件和 BIN 文件的区别 BIN文件是直接的二进制文件,内部没有地址标记。bin文件内部数据按照代码段或者数据段的物
阅读全文
摘要:objcopy用于将object的部分或全部内容拷贝到另一个object,从而可以实现格式的变换。 objcopy可用于将文件转换成S-record格式或者raw二进制格式。 例如, xxxx-elf-objcopy –O srec test.o test.s19 则将test.o转换成s-reco
阅读全文
摘要:使用默认链接文件生成可执行文件: cc = gcc prom = hello DIR= ($shell pwd) inc_dir = $(DIR)/inc src_dir = $(DIR)/src obj = $(pathsubst $(src_dir)/%.c, $(src_dir)/%.o, $
阅读全文
摘要:fflush()的作用是用来清空缓冲区,fflush(stdin)清空标准输入缓冲区,把输入缓冲区里的东西丢弃; fflush(stdout)清空标准输出缓冲区,把输出缓冲区里的东西强制打印到标准输出设备上。 fflush(stdin)不太常用,在有些编译器中是错误的用法,可以用以下方法替代:whi
阅读全文
摘要:这个问题与虚拟地址空间的分配规则有关,每一个可执行C程序,从低地址到高地址依次是:text,data,bss,堆,栈,环境参数变量;其中堆和栈之间有很大的地址空间空闲着,在需要分配空间的时候,堆向上涨,栈往下涨。 这样设计可以使得堆和栈能够充分利用空闲的地址空间。如果栈向上涨的话,我们就必须得指定栈
阅读全文
摘要:例子1 我们都知道数组下表是从0开始的,假如我们想从1开始,可以这么干: 定义一个指针,指向a[-1]这个位置 #include <stdio.h> void main() { int a[] = {1,3,4}; int *p = &a[-1]; int i =0; for( i = 1; i <
阅读全文
摘要:可变参数函数:函数的参数个数是可变的 ANSI C,这些宏的定义位于stdarg.h中: typedef char *va_list; va_start #define va_start(list,param1) ( list = (va_list)¶m1+ sizeof(param1) )
阅读全文
摘要:链接脚本官方文档: https://sourceware.org/binutils/docs-2.39/ld.html 链接脚本实例:(STM32F407VG,RT-Thread Studio生成的工程所含) /* * linker script for STM32F407ZG with GNU l
阅读全文
摘要:背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间。这在使用静态库时,体现的更为严重。有时,我们只使用了静态库仅有的几个功能,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加。 参数详解
阅读全文
摘要:汇编代码语法官方文档: https://sourceware.org/binutils/docs-2.39/as.html 什么是汇编伪指令 1、没有对应机器指令的汇编指令,主要用于协助汇编程序进行汇编。 2、在计算机中直接运行的程序所对应的语言叫机器语言(指令),如果直接按二进制表示出来就是一系列
阅读全文
摘要:startup.s 功能 startup.s 文件定义了向量表,包含栈初始值和各个中断服务函数指针。 芯片一上电,自动设置SP,PC,然后执行复位中断: 设置栈顶寄存器的值 多余,芯片一上电自动设置了 data段的数据从 flash 拷贝到 SRAM bss段位于SRAM,初始化为0 执行 Syst
阅读全文
摘要:typedef int (*init_fn_t)(void);#define RT_USED __attribute__((used))#define INIT_EXPORT(fn, level) RT_USED const init_fn_t __rt_init_##fn SECTION(".rt
阅读全文
摘要:startup.s 功能 不同的开发环境(IAR、KEIL、GCC编译器),startup.s的内容多少有些差别,但是功能基本如下: 设置向量表,包含MSP初值,各中断函数指针 芯片一上电,自动设置SP,PC,然后执行复位中断: 执行 SystemInit,初始化时钟,设置SCB->VTOR的值为向
阅读全文
摘要:Cortex-M3 系列处理器是基于 ARMv7-M 架构的处理器,应用非常广泛,为了能够深入的分析在此平台上跑 RTOS 的各种细节,所以有必要写一篇关于 CM3 处理器的结构相关的文章(CM4 类似),在 OS 调度初始化、系统调用、进程调度等方面的细节均是和具体处理器息息相关,所以先让我们来看
阅读全文
摘要:FreeRTOS 第一次启动任务切换前,需要调用函数 vPortStartFirstTask,初始化 MSP,然后触发 SVC 的中断函数 vPortSVCHandler,中断函数执行出栈后就跳转到第一个任务的入口函数。 之后任务切换通过中断函数 xPortPendSVHandler,此函数会执行入
阅读全文
摘要:知识点: MSP:主堆栈指针,系统复位后,默认使用MSP指针,MSP指针用于操作内核以及处理异常和中断(异常是中断的一种,中断服务程序默认强制使用MSP指针,这是硬件自动设置的) 不使用OS,非中断函数和中断函数都使用MSP PSP:进程堆栈指针,任务(进程)使用PSP指针,在vPortSVCHan
阅读全文
摘要:官方文档 https://www.gnu.org/software/make/manual/make.html 目标 - 依赖文件 - 命令 目标(文件):依赖文件 命令(命令前是一个TAB键) 1、make执行的格式为:make 目标,如果不指定目标,会执行Makefile中第一个出现的没有匹配符
阅读全文
摘要:override指示符 通常在执行 make 时,如果通过命令行定义了一个变量,那么它将替代在 Makefile中出现的同名变量的定义。就是说,对于一个在 Makefile 中使用常规方式(使用“=”、“:=”或者“define”)定义的变量,我们可以在执行 make 时通过命令行方式重新指定这个变
阅读全文