2023/12/25重启韦东山老师RTO
韦东山freeRTOS快速入门视频教程
P2 2-1堆的概念
堆
char heap_buf[1024]; int pos = 0; void *my_malloc(int size) { int old_pos = pos; pos += size; return &heap_buf[old_pos]; } void my_free(void *buf) { /* err */ } int main(void) { char ch = 65; // char ch = 'A'; char *buf = my_malloc(100); unsigned char uch = 200; for (i = 0; i < 26; i++) buf[i] = 'A' + i; }
这里void *my_malloc(int size)是一个指针函数,返回的是一个地址。
这段代码在调试器中调试后,经过几次循环buf[i]的值会有改变,底下附图。
疑惑及学习
1、2、 断点,按下3程序运行到1就会暂停,按下4,程序往下执行一行,进入for循环多点几次4,查看buf的值。
问
答 gpt解
问
后面那个问题不回答了
答gpt解 不行,自己来
参考CSDN这个例子
typedef struct _Data{ int a; int b; }Data; //指针函数 Data* f(int a,int b){ Data * data = new Data; data->a = a; data->b = b; return data; } int main(int argc, char *argv[]) { QApplication a(argc, argv); //调用指针函数 Data * myData = f(4,5); qDebug() << "f(4,5) = " << myData->a << myData->b; return a.exec(); }
输出如下:
f(4,5) = 4 5
Data * myData = f(4,5); 这行代码将f函数里面赋值4和5,然后将其地址返回给myData,所以myDatat,就相当于是f函数(自己的理解,因为myData这个函数的地址就是这个,),之后输出打印当中相当于myData这个地址里边有a和b两个变量,然后他们的值已经在f函数中给过了。
再看上面韦东山老师代码,buf就相当于my_malloc这个函数,buf存的这个地址拥有my_malloc这个函数里边的东西,注意看my_malloc这个函数,它最终返回了一个数组的地址,所以为什么,gpt当中说buf是指向字符数组的指针。要在英文的路径下安放文件,不然调试器关闭的时候出问题。或者取消断点。^--^
P3 2-2栈的概念
栈
char heap_buf[1024]; int pos = 0; void *my_malloc(int size) { int old_pos = pos; pos += size; return &heap_buf[old_pos]; } void my_free(void *buf) { /* err */ } void c_fun(void) { } void b_fun(void) { } int a_fun(int val) { int a = 8; a += val; b_fun(); c_fun(); return a; } int main(void) { char ch = 65; // char ch = 'A'; int i; char *buf = my_malloc(100); unsigned char uch = 200; for (i = 0; i < 26; i++) buf[i] = 'A' + i; a_fun(46); return 0; }
a 函数返回给return 0,返回地址保存在哪里?
LR (Link registev),暂且把它看作一个寄存器/ 看下面的流程、
/
使用栈的过程
C函数开头:
1、划分栈
2、LR…局部变量存入栈中
3、执行代码(比如 a=8; 在划分的栈里面把8写进去)
、
返回的地址就是下一句代码的位置
BL main会做两个事情
第一,将返回地址存在LR中
第二,执行main函数
main函数会划分出自己的栈,假设他划分出SP=sp-n,这里面会保存lr等寄存器,会保存局部变量。
第二步,执行a函数,第一 lr=a的返回地址,第二执行函数a,函数a执行的事情和main类似,划分出SP=sp-m的栈,在这一块空间里面会放lr的值以及a的局部变量
第二步,调用到函数b,操作同上两步差不多。在执行b的时候,他会将返回值付给lr,也就是c(下一句代码的位置),然后执行b函数 ,将lr的值放到保存划出来栈当中,这里的lr相当于是保存一个值,然后将值再放入别的函数画出来的栈当中,然后这个lr就可以被别的函数地址覆盖掉了,因为前面那一个函数的地址已经被保存到自己的栈里面了,
当b函数执行完之后,注意是执行完之后,他就会返回到他原本自己存的lr地址的位置,也就是下一句代码,就开始执行c函数了然后当函数a执行到return a的时候,他已经完成了他的工作,他要返回去,他去自己的栈里把自己的lr当时存的值取出来,跳过去执行这个值就是return 0,也就是main中a函数下面的return 0
从这个过程中,我们可以看到,栈在保存返回地址的时候起的作用,(应该是l2那个寄存器反复被利用,然后存到各自相应的栈中)划分出来的地址是下一行代码的位置
相当于lr保存的是下一条语句的地址
、
、
删掉
tools也删掉
D:\RTOS_study\FreeRTOSv202107.00\FreeRTOS\Demo
Demo中只保留和Comm…文件
还有一部分不需要不做展示,按照如下目录选择
、
、
、