1043|2

182

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

RT-thread 创建任务 学习(2)记录遇到一个着实看不懂的代码 [复制链接]

任务创建中,首先要初始化,那做了哪些工作? 主要是这个函数_thread_init  具体实现分析下

记录遇到一个着实看不懂的代码(见第7)

 

1. 初始化链表

rt_list_init(&(thread->tlist));

这个链表有意思,用这个链表把一个个任务放在一个链表里面

struct rt_list_node
{
    struct rt_list_node *next;                          /**< point to next node. */
    struct rt_list_node *prev;                          /**< point to prev node. */
};

 

2.  把任务的入口函数,参数,地址和大小赋值给任务控制块

    thread->entry = (void *)entry;
    thread->parameter = parameter;

    /* stack init */
    thread->stack_addr = stack_start;
    thread->stack_size = stack_size;

    /* init thread stack */
    rt_memset(thread->stack_addr, '#', thread->stack_size);

 

3. 任务栈指针的处理,待研究

    thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter,
                                          (rt_uint8_t *)((char *)thread->stack_addr + thread->stack_size - sizeof(rt_ubase_t)),
                                          (void *)_thread_exit);

 

4. 任务优先级

    thread->init_priority    = priority;
    thread->current_priority = priority;

    thread->number_mask = 0;

 

5. 任务的tick,这个什么用途?tick is the time slice if there are same priority thread,如果有相同优先级

    thread->init_tick      = tick;
    thread->remaining_tick = tick;

 

6. 初始化定时器,这个定时器有啥用途呢?

    rt_timer_init(&(thread->thread_timer),
                  thread->name,
                  _thread_timeout,
                  thread,
                  0,
                  RT_TIMER_FLAG_ONE_SHOT);

 

7.  RT_OBJECT_HOOK_CALL(rt_thread_inited_hook, (thread));  是什么意思?初始化钩子函数

根据以下代码

static void (*rt_thread_inited_hook) (rt_thread_t thread);

#define RT_OBJECT_HOOK_CALL(func, argv)         __on_##func argv

 

组合成  __on_rt_thread_inited_hook(thread),初始化钩子函数

 

果然,之后找到原文

#ifndef __on_rt_thread_inited_hook
    #define __on_rt_thread_inited_hook(thread)      __ON_HOOK_ARGS(rt_thread_inited_hook, (thread))
#endif

 

往下继续找宏定义

define __ON_HOOK_ARGS(__hook, argv)        do {if ((__hook) != RT_NULL) __hook argv; } while (0)

 

怎么感觉绕了一大圈,绕不懂了,搞这么复杂干啥,我就很不懂啊,按照我的理解,直接写成下面的不好吗

#define RT_OBJECT_HOOK_CALL(func, argv)         do {if ((func) != RT_NULL) func argv; } while (0)

 

 

最新回复

封装这么多层,应该是为了让代码更好移植且更安全。   详情 回复 发表于 2023-6-14 11:09
点赞 关注

回复
举报

7219

帖子

2

TA的资源

版主

沙发
 

封装这么多层,应该是为了让代码更好移植且更安全。

点评

这么解释有道理  详情 回复 发表于 2023-6-14 14:16
 
 

回复

182

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
wangerxian 发表于 2023-6-14 11:09 封装这么多层,应该是为了让代码更好移植且更安全。

这么解释有道理

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表