-
STM32RCC时钟树详解
一、stm32时钟体系stm32一共有四个可能的时钟源 内部高速时钟HSI,一般是8Mhz,上电复位之后的默认时钟 内部低速时钟LSI,一般是40khz,在低功耗模式下可以使用,也可以给RTC或者看门狗提供时钟源。RTC是实时时钟,可以依赖备用电源在很长时间内记录时间 外部高速时钟HSE,可以由外部晶振产生也可以是外部用户输入,相比于默认的HSI,精度更高,一般上电之后初始化时钟时会把时... -
Tmux教程
Tmux可以允许关闭窗口但是保留会话,多用于ssh连接服务器的场景,防止关闭网络连接后服务器上的会话自动关闭而停止任务的执行。
-
ucOSii临界区
临界区定义操作系统在处理关键代码时,也就是进入临界区时,需要关闭中断,防止中断打断当前执行的关键代码,造成系统资源的破坏。 关键就在于关闭中断,控制中断寄存器进行中断关闭。但是,如果单纯的在进入临界区之前关中断,在退出临界区之后开中断,岂不是破坏了原本的中断状态?例如在某些地方可能已经被关闭了中断,那么退出临界区之后我们要恢复的就是关中断的状态。 我们要做的就是在进入临界区前记录一下此刻的... -
链接脚本LinkerScript
链接脚本的作用在嵌入式开发中,需要指定不同的段烧录到单片机的地址,这个过程由链接脚本指定。 一般来说链接脚本根据芯片的不同,设定不同的RAM和FLASH起始地址和长度。 除了指示链接的过程,还可以将地址变成变量,传递给启动文件,例如bss段和data段的起始位置和结束位置,能够让启动文件从flash中搬运data段到RAM中,以及初始化bss段的数据为0。 链接脚本和段现在想象有一个RAM,... -
MyRTOS
写在前面目前个人的发展方向应该是RTOS。 想基于uCOS开始写一个属于自己的嵌入式操作系统,同时增加自己对嵌入式操作系统的理解和认识。 零、内存管理为什么要把内存管理放在任务调度之前呢?明明说嵌入式操作系统的核心是任务调度,内存管理可以手动进行管理。 正是因为在设计任务调度的TCB时考虑到了这个事情。用户层面的动态内存管理是不必要的,但是系统资源的内存管理是需要考虑的。整个嵌入式系统运行期... -
Gcc交叉编译汇编文件报错
问题描述使用Cmake搭建交叉编译工具链来编译stm32项目,编译器为arm-none-eabi-gcc。使用编译器编译uCOS中cpu架构相关的文件os_cpu_a.s编译不成功。 项目是从keil项目直接移植过来的。 反复检查Cmake对汇编文件的编译选项并没有发现错误。 报错原因移植uCOS运行在单片机上时,官方提供的代码接口是编译器相关的,原来的文件是适配ARMCC工具链的,现在在G... -
undefined reference to `__errno‘ 解决办法
问题描述编译stm32项目时,因为引入了math库,导致报错 undefined reference to `__errno‘ 报错原因多个库文件的链接顺序问题。这里没有手动指定链接的顺序,所以会报错 问题解决链接时加上指令 -specs=rdimon.specs and -specs=nosys.specs -
Git提交规范
将自己的四轴项目推送到github,但是写出来的commit非常抽象,遂学习git提交规范
-
ucOSii任务调度
uCOS任务调度算法思路这里介绍uCOS最重要的任务调度算法:优先级位图法。 首先明确,uCOS中每一个任务都有唯一的优先级,也就是说一个优先级就能直接确定一个任务。 当创建一个新任务时,要给它一个确定的优先级,然后将这个优先级的任务设为就绪。 当任务放弃处理器,调度器介入时,需要在所有的就绪的任务中找到优先级最高的任务。 对于第一个要求,只要有一个数据结构来存储就绪的状态即可,例如... -
uCOSii内存管理
uCOS内存管理思路uCOS的内存管理非常简单,有5个连接在一起的partition,这5个partition又分别连接着一系列的size固定,个数确定的block。 也就是说每一个partition只能有一个size,能够使用的内存大小就只有这五种。 好处是内存分配是常数时间,而且是很快的常数时间。在5个partition中遍历一下找到适合的size,直接取对应的freelist即可。 坏...