设为首页 加入收藏

TOP

源码解读·RT-Thread操作系统从开机到关机(五)
2019-08-27 07:20:57 】 浏览:103
Tags:源码 解读 RT-Thread 操作系统 开机 关机
tf(
"initialize %s", desc->fn_name); result = desc->fn(); rt_kprintf(":%d done\n", result); } #else const init_fn_t *fn_ptr; for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr++) { (*fn_ptr)(); } #endif }
之所以要分开这两个函数就是因为board阶段的初始化比其它普通的组件初始化早,board阶段的初始化通常没什么系统资源依赖。而其它情况下则通常在操作系统已经完成必要的初始化后才能做的初始化才会放在rt_components_init里。

任务是怎样运行起来的

要说明任务是怎么运行起来的,就得知道任务是怎么创建的,其次结合之前写的文章<源码解读·RT-Thread多任务调度算法>就差不多了。那么这里就介绍一下任务的创建。照样用上面的rt_application_init里创建任务的代码来举例:

void rt_application_init(void)
{
    rt_thread_t tid;
 
#ifdef RT_USING_HEAP
    tid = rt_thread_create("main", main_thread_entry, RT_NULL,
                          RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
    RT_ASSERT(tid != RT_NULL);
#else
    rt_err_t result;
 
    tid = &main_thread;
    result =rt_thread_init(tid, "main", main_thread_entry, RT_NULL,
                            main_stack, sizeof(main_stack),RT_MAIN_THREAD_PRIORITY, 20);
    RT_ASSERT(result == RT_EOK);
    
    /* if not define RT_USING_HEAP, using toeliminate the warning */
    (void)result;
#endif
 
    rt_thread_startup(tid);
}
首先要说明的是RT-Thread任务创建有两种,一种是动态的,一种是静态的。所谓的动态就是其任务栈自动在堆内存中分配;静态是用户自己指定栈空间,当然通常这个栈来自于用户定义的数组。如上例中当RT_USING_HEAP宏被打开,也就是有堆内存的时候会采用rt_thread_create接口来创建动态资源的任务。当然可以利用rt_thread_init来创建一个静态资源的任务。先来了解一下这两个函数在创建任务时的一些参数:”main”这是任务的名称,任务名称用一个字符串来指定,不是很重要,不过最好能起到一定的说明性,有利于今后调试用。main_thread_entry这是任务的入口函数,所谓的任务就是一个C语言中的函数而已。RT_NULL,这是传给任务入口函数的参数,如果没有就为NULL.因为RT_Thread中的任务原型为:void (*entry)(void*parameter);RT_MAIN_THREAD_STACK_SIZE为任务的栈大小,以字节为单位。RT_MAIN_THREAD_PRIORITY为任务的优先级号。20为任务的时间片大小。其中静态任务中还有tid代表任务的TCB数据结构句柄。main_stack为栈空间起始地址。当用动态创建的方法创建成功后会返回一个任务的TCB任务句柄出来。之后我们利用rt_thread_startup(任务句柄)的形式启动任务即可。例如上例中rt_thread_startup(tid);不过rt_thread_startup函数真正的功能是将任务放置于调度队列中,并置任务状态为ready,由此交给调度器去调度,能不能立马运行取决与调度器的调度。一般情况下,要想任务获得运行必须满足的条件:调度器已经运行,任务已经ready,没有更高优先级任务,没有中断发生。只要条件满足调度器就会调度此任务,做好必要的栈初始化和状态置位,就会切换到任务开始运行。只要任务获得运行就会使用创建任务时指定的栈空间。

不过一般的任务通常是一直运行,持续的服务。形式如下:

void task(void *parameter)
{
    while (1)
    {
        // do_work();
    }
}

idle任务与新的构想

上面解释过idle任务在rt-thread操作系统中的功能:释放资源、低功耗设计。

关于资源释放通常是任务的析构过程,这就是任务的结束。例如上例中的main_thread_entry任务之所以称为小任务的原因就是它做完事情就结束了。那么可能就会想,既然任务都结束了那么它的资源如何释放呢?比如栈空间,TCB等。这就是idle该干的事情。即使所有的用户任务都结束,最后也会剩下idle任务在运行。如果有必要的话,可以在idle任务中可以通过调用低功耗组件进入低功耗或者干脆调用电源开关控制来关机。

其次idle任务占用了最低优先级。虽然用户任务也可以使用和idle任务相同的优先级,但是并不建议这样做,比如在低功耗设计时就会出问题。另外我个人在思考一个问题,idel任务既然以经在设计之初就明确了其获得运行的条件,那么何不做成无需优先级的任务,唯一的调度决策就是:当调度器没有任务处于ready状态时就切换到idel任务运行。这就无需关注最低优先级被idle霸占的问题了。

 

感谢各位网友的支持,可以关注我的微信公众号:鹏城码夫   (微信号:rocotona)

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇解决SDL/SDL.h: No such file or .. 下一篇初级模拟电路:3-2 BJT的工作原理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目