应用代码分析:
/* thread phase init */
void rt_thread_entry_led(void *parameter)
{
unsigned int count=0;
while (1)
{
rt_kprintf("led on,count : %d\r\n",count);
count++;
/* 开启led */
rt_hw_led_on();
/* 睡眠50个OS tick, OS tick时间在rtconfig.h中配置,默认为10ms */
rt_thread_delay(50); /* sleep 0.5 second and switch to other thread */
rt_kprintf("led off\r\n");
/* 关闭led */
rt_hw_led_off();
/* 睡眠0.5秒 */
rt_thread_delay(50);
}
}
int rt_application_init()
{
rt_thread_t init_thread;
/* 创建led闪烁任务 */
init_thread = rt_thread_create("led",
rt_thread_entry_led, RT_NULL,
1024, 21, 20);
/* 启动任务 */
rt_thread_startup(init_thread);
return 0;
}
如上所示,这就是Hello Led应用部分的代码,非常简单,入口地方在application.c文件的rt_application_init函数中,在这个函数中创建了一个动态线程。这个线程的入口在rt_thread_entry_led函数:这个函数是一个简单的while(1)循环,先点亮灯,然后过50个OS时钟节拍后熄灭,再过50个OS时钟节拍后再点亮。同时,串口也会一直输出led on 和led off的消息。
系统初始化部分代码分析:
RT-Thread系统的入口是startup.c文件中的main函数;在main函数中,因为默认Keil MDK环境下中断是开启的,所以第一件事是关闭系统总中断。系统的总中断会在第一个线程被调度执行时自动打开(因为机器状态字在栈的初始化时被置上打开中断),main函数中调用真正的RT-Thread系统入口函数:rtthread_startup,这个函数主要分为几个部分:
* rt_hw_board_init硬件相关的初始化;
* rt_system_heap_init系统堆初始化,会用于系统的动态内存分配;
* rt_application_init用户应用初始化;
* rt_system_scheduler_start启动系统调度器。
这就是在RT-Thread上运行的最简单的一个应用!有了这个基础,我们后面就可以继续前进了。