0x00 LiteOS_Lab仓库组件详解--OS

举报
樊心昊 发表于 2020/04/22 15:28:35 2020/04/22
【摘要】 摘要:之前我们在汇总帖中讨论过LiteOS_Lab中的所有东西都是以组件化实现的包括了OS,所以这期来详解OS组件github上LiteOS_Lab中OS组件直达链接:https://github.com/LiteOS/LiteOS_Lab/tree/iot_link/iot_link/osOSAL的AL=abstract layer 抽象层,其他地方的AL也可以以此类推。一、OS组件总览文...

摘要:之前我们在汇总帖中讨论过LiteOS_Lab中的所有东西都是以组件化实现的包括了OS,所以这期来详解OS组件


github上LiteOS_Lab中OS组件直达链接:https://github.com/LiteOS/LiteOS_Lab/tree/iot_link/iot_link/os


OSAL的AL=abstract layer 抽象层,其他地方的AL也可以以此类推。

一、OS组件总览

文件名作用
linux
可以在Linux运行的os,其实就是linux中抽象出来的os接口
liteos可以在单片机上运行的os(stm32等),一整套内核(包括了任务调度等等功能),后面我也会详细说它
macos可以在macos运行的os,其实就是macos中抽象出来的os接口
novaos可以在单片机上运行的os(stm32等),比较精巧,一整套内核(包括了任务调度等等功能)
osalos抽象层,给其他组件调用(at、shell等等),可以看下面的结构图理解调用关系
ucosiiucosii比较经典的内核之一
Readme.meos组件的介绍
kconfig_os用于图形化配置os组件
os.mk用于根据配置控制编译os的组件

组件调用关系图:image.png

二、详解OSAL层

由于篇幅有限,只能列举部分函数,以任务相关的函数为主。

image.png

这些函数都在OSAL层中声明过了,不过它们是一个接口,它们只是去调用我们实现并注册好的任务函数。举个任务创建的例子:

1
2
3
4
5
6
7
8
9
10
11
void* osal_task_create(const char *name,int (*task_entry)(void *args),\    
void *args,int stack_size,void *stack,int prior)    
{    
    void *ret = NULL;    
    if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->task_create))    
    {    
        ret = s_os_cb->ops->task_create(name, task_entry,args,stack_size,stack,prior);    
    }    
    return ret;    
}
/* 引自os/osal/osal.c */

看到了吧,这个函数最终调用的是我们注册进s_os_cb结构体中ops成员中的task_create函数指针,如何注册呢?再来一个LiteOS注册的实例:

Liteos的任务创建函数是LOS_TaskCreate我们需要对它进行以下封装,使它变成osal_task_create类型的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void *__task_create(const char *name,int (*task_entry)(void *args),\    
void *args,int stack_size,void *stack,int prior)    
{    
    void *ret = NULL;    
    UINT32 uwRet = LOS_OK;    
    UINT32  handle;    
    TSK_INIT_PARAM_S task_init_param;    
    memset (&task_init_param, 0, sizeof (TSK_INIT_PARAM_S));    
    task_init_param.uwArg = (unsigned int)(uintptr_t)args;    
    task_init_param.usTaskPrio = (unsigned short)prior;    
    task_init_param.pcName =(char *) name;    
    task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)task_entry;    
    task_init_param.uwStackSize = stack_size;    
    uwRet = LOS_TaskCreate(&handle, &task_init_param);    
    if(LOS_OK != uwRet){    
        return ret;    
    }    
    ret = (void *)(uintptr_t)handle;    
    return ret;    
}    
/* 引自os/liteos/liteos_imp.c */

封装好了之后把他存到tag_os_ops类型的s_liteos_ops结构体中:

image.png

并将s_liteos_ops结构体指针存到tag_os类型的s_link_liteos结构体中:

image.png

最后调用osal_install函数完成注册:

image.png

其他函数大家可以以此类推。

PS:文章到这里就算写完了,如果有疑问请留言,或者又想听的内容也尽管留言!如果对你有帮助也希望能点个赞或者留个言,这是对我最大的鼓励!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。