- 博客(13)
- 收藏
- 关注
原创 stm32cubemx设置系统时基的两种方式和区别(systick和timer)
用systick作为时基的时候,HAL_Init中的HAL_InitTick函数会通过HAL_SYSTICK_Config函数对systick中断的时间配置为1ms。用HAL_GetTick来获取这个值,然后用每次获取的这个值减去刚进入HAL_Delay的时候的那个时间的这个变量的值做减法,就是进了多少次tim的中断,也就是过了多少ms,用这个两个的差值与HAL_Delay传入的参数值(这个参数值就是延时多少ms的数值)做对比,当比它大的时候,结束while循环,也就是延时时间到了,退出函数。
2024-11-08 15:12:56 505
原创 FreeRTOS调度器解挂(xTaskResumeAll)的理解
实际上是说,正常来说,假设调度器挂起的这段时间,没有挂起调度器,那么滴答定时器的处理函数会按部就班的进行,那么xTaskIncrementTick函数也会按部就班的执行,我们在看xTaskIncrementTick代码的时候,里面有一个if判断,就是当调度器没有被挂起的时候,记录时钟的全局变量是xTickCount,那么如果调度器被挂起了呢,这时候变成了uxPendedTicks这个变量。这样确保了滴答定时器的计数不会滑动,并且任何在延时的任务都会在正确的时间恢复。=0的那个分支,也就是else中由。
2024-07-03 17:03:25 906
原创 FreeRTOS上下文切换问题--pendSV和Systick优先级为什么要设定为最低
其实在写文章中,笔者发现,无论是设置SysTick异常优先级最低,还是让中断优先级比SysTick异常低,都会有一个问题,就是谁的优先级低,谁的执行就会被挂起从而导致延迟,这么搞的话,要得到完美的操作系统是不可能的,两弊相衡取其轻,我们需要的是中断的执行要迅速,从而做到实时性,没有说任务切换需要实时性吧。因此把SysTick异常的优先级定的最低,是满足设计RTOS的初衷的。
2024-06-19 14:22:06 1206
原创 外部中断初始化函数分析
当然这样说还没说清楚,这样写的目的是因为,我们这个EXTI_Line成员这样赋值,是因为这个值到了EXTI_Init这个初始化函数中去用的时候,都是和32bit的寄存器进行与或非加运算的,比如:IMR寄存器是EXTI基地址上的那个寄存器,它一定是一个32bit的寄存器吧,你这时候用的是线5,你如果直接用这个32bit的寄存器的地址加5,二进制的5是0x5,实际就是将寄存器的0bit和2bit给置1了,这肯定就是错的。第二,有了物理线,那信号来了是要产生中断还是产生事件呢?
2024-06-13 16:24:12 627
原创 cortex-m3中断及异常(NVIC和SCB的作用)
写具体内容之前,说点闲话。不知道大家有没有这样的体验,在学单片机(stm32)的中断的时候,首先学习的就是外部中断,也就是EXTI这个外设。因为总以为只要是中断讲的就是外部中断,因此以为学习了EXTI就是学完了中断,但是又发现只要用中断就要用NVIC以及SCB中的AIRCR这个寄存器。所有就会很混乱,到底那个才是中断的最合理的学习对象。其实学习中断,最应该仔细研究的是NVIC和SCB,NVIC和SCB都是内核的外设,NVIC这个外设就是用来管理所有的中断的,但是有它还不够,注意这里说的是中断,不包括异常。
2024-06-13 14:09:08 1399 1
原创 FreeRTOS任务调度之如何跳转到用户任务
以上执行完了就到了任务执行体中,当然在任务执行体中会有一个切换的异常唤醒,任务的切换就是在那个异常中执行的,内容与本文无关。本文的目的就是让与笔者有同样困惑于启动第一个任务的执行过程的朋友,去理解FreeRTOS是如何根据ARM内核的工作特性去完成启动一个已经初始化好的任务的,重点就是关注两个任务栈的在什么工作状态下的切换,以及关注出入栈的寄存器的值,因为寄存器的值直接影响到各个函数之间跳转的理解。
2023-10-24 11:03:44 345
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人