RTOS_WDS

发布时间:2023年12月26日

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…文件

还有一部分不需要不做展示,按照如下目录选择

文章来源:https://blog.csdn.net/LDBH66/article/details/135210116
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。