RT-Thread 内核实现与应用开发实战指南
1、数据类型rtdef.h 中的数据类型
在裸机系统中,他们统统放在一个叫栈的地方,栈是单片机 RAM 里面一段连续的内存空间,栈的大小一般在启动文件或者链接脚本里面指定, 最后由 C 库函数_main 进行初始化。
但是, 在多线程系统中,每个线程都是独立的,互不干扰的,所以要为每个线程都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组, 也可以是动态分配的一段内存空间,但它们都存在于 RAM 中。
rt_err_t rt_thread_init(struct rt_thread *thread, // thread 是线程控制块指针。
void (*entry)(void *parameter), //entry 是线程函数名, 表示线程的入口。
void *parameter, // parameter 是线程形参,用于传递线程参数。
void *stack_start, //stack_start 用于指向线程栈的起始地址。
rt_uint32_t stack_size) //stack_size 表示线程栈的大小,单位为字节
临界段的保护
定义线程栈
在 RT-Thread 系统中,每一个线程都是独立的,他们的运行环境都单独的保存在他们的栈空间当中。那么在定义好线程函数之后,我们还要为线程定义一个栈,目前我们使用
的是静态内存,所以线程栈是一个独立的全局变量,具体见代码清单 14-4。 线程的栈占用的是 MCU 内部的 RAM,当线程越多的时候,需要使用的栈空间就越大,即需要使用的
RAM 空间就越多。一个 MCU 能够支持多少线程,就得看你的 RAM 空间有多少。
动态内存:在动态内存池中分配用户指定大小的内存块。
优点:按需分配,在设备中灵活使用。
缺点:内存池中可能出现碎片。
静态内存:在静态内存池中分配用户初始化时预设(固定)大小的内存块。
优点:分配和释放效率高,静态内存池中无碎片。
缺点:只能申请到初始化预设大小的内存块,不能按需申请