一、RT-Thread 初始化函数
1.RT_thread 的初始化函数是:rt_hw_board_init(); 可将外设初始化放在其中,这时候还未运行操作系统。
二、RT-Thread GPIO初始化函数
2.RT_thread 的GPIO初始化函数为:rt_pin_mode(GET_PIN(G, 13), PIN_MODE_OUTPUT);
三、RT_thread 创建静态线程的过程
1. 创建线程入口函数 (实现功能,可以定义为静态函数)
/* 创建线程函数 */
static void led1_thread_entry(void* parameter)
{
while(1)
{
rt_pin_write(LED1_PIN, PIN_HIGH);
rt_thread_delay(500);
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_delay(500);
}
}
2. 定义线程堆栈大小和线程控制块
/* 定义线程控制块 */
static struct rt_thread led1_thread;
/* 定义线程控栈时要求 RT_ALIGN_SIZE 个字节对齐 */
ALIGN(RT_ALIGN_SIZE)
/* 定义线程栈 */
static rt_uint8_t rt_led1_thread_stack[512]; (设置线程堆栈大小)
3. 创建静态线程
/***** 创建线程函数 *******/
int create_led_thread(void)
{
/***** 创建线程函数 *******/
rt_thread_init( &led1_thread, //线程控制块地址
"LED1", //线程名字
led1_thread_entry, //线程入口函数
RT_NULL, //线程入口参数
&rt_led1_thread_stack[0], //线程栈起始地址
sizeof(rt_led1_thread_stack), //线程栈大小
3, //线程优先级
20); //时间片参数
rt_thread_startup(&led1_thread); //创建完成就开始运行
return 1;
}
四、RT-Thread创建动态线程
1. 创建线程入口函数 (实现功能,可以定义为静态函数)
/* 创建线程函数 */
static void led1_thread_entry(void* parameter)
{
while(1)
{
rt_pin_write(LED1_PIN, PIN_HIGH);
rt_thread_delay(500);
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_delay(500);
}
}
2. /* 定义线程控制块 */
static rt_thread_t led1_thread = RT_NULL;
3. 创建动态线程
int create_led2_thread(void)
{
led1_thread = //返回线程创建标志
rt_thread_create( "LED1", //线程名字
led1_thread_entry, //线程入口函数
RT_NULL, //线程入口参数
512, //线程堆栈大小
3, //线程优先级
20); //时间片参数
if(led1_thread != RT_NULL) //如果线程创建成功开始运行
rt_thread_startup(led1_thread);
else
return -1;
}
对比:创建动态线程不用 程序员建立堆栈,只需要规定堆栈大小即可,而且程序控制块不再是结构体,而是个变量,
可调用函数 MSH_CMD_EXPORT(线程创建函数名, MSH命令行中的名字); 将线程加入命令行中
五、RT_thread 时间片参数
当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。 这个时间片运行结束时,调度器自动选择下一个就绪态的同优先级线程进行运行。 如果同一个优先级下只有一个线程,那么时间片这个形参就不起作用。
六、RT-Thread线程启动方式
1. 调用函数 rt_thread_startup(线程控制块变量);
七、__CC_ARM编译环境下的 S u b Sub Sub$ 与 S u p e r Super Super $ 功能
1.在BOOT里会首先跳转到__main函数,
2.如果使用了$Sub$$main 函数将首先跳转到abc这个函数去运行,做一些初始化
3.$Super$ $mian 可以直接跳转到 正规的main函数,
Exmple:首先跳转到Sub$$main ,然后再通过Super$$跳转到 main
int $Sub$$main(void)
{
//添加补丁函数
$Super$$main(); //使用本句直接转到main()运行
}
总结: $Sub$$main 跳出; $Super$ $mian 跳回main