- 博客(11)
- 收藏
- 关注
原创 freertos
(解释:栈有两种增长方式,向上增长:栈底在低地址,栈顶向高出增长,向下增长:栈底高地址,栈顶向低地址增长)②PendSV中上部分保存前文的任务(以便任务恢复后继续执行),vTaskSwitchContext中切换任务(1、得到之前创建任务是保存的最大优先级2、根据优先级找到对应的就绪链表,里面链表项->owner指向的任务通过链表遍历依次赋值给pxCurrentTCB)1、 新建的任务为第一个创建的任务,pxCurrentTCB=新建任务,2、 初始化任务名(字符串)、优先级、初始化链表项。
2024-04-07 15:26:13
719
原创 蓝桥杯嵌入式
在源工程中的cubeMX构建led初始化,八个引脚,一个锁存器引脚,移植到打底工程中,并在打底工程中建立lLed_Disp(char ucLed)函数,此函数通过(ucLed
2024-04-01 19:21:23
229
1
原创 qt 有关c++的知识点
const在局部变量时,如果没有分配内存空间,相当于#define分配到符号表中,如果const修饰的变量分配了内存空间,则可以访问有地址内存空间的变量。4、this指针:类的变量和函数虽然在类中捆绑声明,但在内存中是分开储存的,变量存在栈区,函数存在代码区。2、引用函数形参:c中当使用交换函数时,直接将交换的数传给函数,只传了值,函数里的形参和交换的不是同一个变量,并未完成交换。(表示继承中的父类)3、引用作为函数的返回值:引用返回值为右值,返回的变量作为右值赋给新定义的引用,新的引用是返回变量的别名,
2024-03-08 20:01:09
1365
1
原创 freertos 入门总结
第一步: 定义了一个函数指针,返回值为空,参数为通用指针的函数指针。第二步:通过typedef把这种指针的类型改名为TaskFunction_t,可以通过TaskFunction_t定义指针。2.freertos在main中通过调度多个任务运行,每个任务之间以小时间交叉运行,实现了人感觉上的同时运行。1.裸机在main函数里通过while(1)自上而下运行。2.打开keil时要把老的换成新的keil文件再重新打开。1.commen文件删了。
2024-03-08 20:00:54
109
1
原创 freertos内部机制——链表
通过冒泡算法比较(:假设由五个链表项,第一个分别和第二到第五个比较,比较完后第二个按照第一个继续和下面的比较)排序(通过前面的删除和添加进行排序)难点:在添加时头节点的结构体类型和节点的结构体类型不同,指针指向成员时得分别赋值,程序很麻烦。这种链表要是要访问节点所在结构体其他成员时有三种方法:一种是把节点结构体放在所在结构体的第一个变量上,节点结构体的地址就是所在结构体的地址,第二种是在节点结构体中再定义一个指向他所在结构体的指针。在链表中,如果想把不同类型的结构体连成链表,就要用到这种链表。
2024-03-08 19:58:26
1174
1
原创 记录遇到的bug
keil路径:Keil_v5/ARM/Segger安装目录 jlink路径:Jlink\SEGGER\JLink_V794f。基本都是把Keil5的安装路径下的JLinkARM.dll换成J-link安装路径下的JLinkARM.dll。
2024-02-29 12:49:56
204
原创 freertos内部机制——队列、信号量、互斥量、任务通知等的总结
2、队列的接收,关中断,判断队列里的消息是否大于零,【1】大于零,读完,判读已经休眠的写列表中是否有任务,如果有则唤醒(产出写等待链表中的第一个任务,把此任务从delay移到ready)【2】小于零,是否等待,不等待,返回错误,等待,写入等待链表,从ready移到delay。2、写信号量:如果信号量小于1,则加一,判断读等待链表中是否有任务,有则唤醒,(delay移到到ready,删除此任务在读等待链表)3、读信号量、判断是否大于零,大于零则读,--,小于零则是否等待,否,返回错误,是,移动链表,同上。
2023-09-24 12:06:32
161
1
原创 freertos内部机制——heap
2、分配想要内存大小,包括结构体大小和想要大小,并按以字节方式分配3、以内存大小找到合适的内存块,并判断是否大很多,如果大很多则需要拆开,拆开的新的按地址大小插入链表中,再判断新链表项地址加上大小是否等于下个链表项地址,左右都要判断,如果能则可以和平成一个块。2、分配想要内存大小,包括结构体大小和想要大小,并按以字节方式分配3、以结构体中存储内存大小的方式寻找此链表中大小小于要分配的内存大小,找到此内存链表项币向要分配地大与某个值,则把此内存拆开,新拆开的插入链表。下面分配内存也是以字节对齐的方式寻址的。
2023-09-23 15:57:33
358
1
原创 freertos内部机制——队列
2_1、在2的条件下读完后,会判断链表waitingtoset里面是不是空,如果不是空,就唤醒,具体操作是把waitingtoset里的任务移除,并把此任务从delaylist移到readylist。队列的写:1、首先会关闭中断,2、判断队列里当前的元素和满载时元素的个数,如果符合,则写入2_1、写完后直接判断waitingtoreceive链表中有没有等待的任务,如果有,就把此任务从delaylist移到readylist,并从waitingtoreceive中删除。2、队列的休眠与唤醒。
2023-09-19 21:12:53
70
原创 freertos 内部机制——任务的创建
与创建任务函数相比,TCB结构体中少了任务函数地址和函数参数。在上节知道函数被切换时会保留现场(即保存cpu的r0-r15到栈中),现在,在任务创建后,任务函数处于暂停态,任务函数地址和函数参数分别存储在pc和r0寄存器中,使函数恢复。在栈中会存贮LR寄存器的值用来返回也会占用空间,LR为函数结束后下一句代码的地址。而根据实验栈空间大小是估计分配的(通过观察任务中定义的变量和任务执行深度(即子函数))栈空间是定义了一个17*1024的数组,用来分配栈。6、TCB结构体(里面定义有创建任务的组成成分)
2023-09-16 20:35:52
107
1
原创 freetos的内部机制1——函数的切换
好了,差不多知道这个函数对应的汇编了,那么问题来了,当程序执行到cpu寄存器读入数据还没存的时候此时发生切换,在下个函数中将会改变此寄存器的值,所以函数在切换时要保存现场,在freetos中保存现场会将所有的寄存器的值存贮在栈中,为下次跳转回来继续用,读指令:第一个ldr:括号里的表示地址,把r0加上偏移地址赋给r2,(r0和r1由系统固定为函数的形参) 第二个pop:从sp(栈)里读数据赋给r3,pc(r15)低地址给小号寄存器。大体上可分为两大块,读写指令,和加减指令。
2023-09-16 16:09:22
119
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人