建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

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

确定
我再想想
选择版块
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

樊心昊

发帖: 172粉丝: 139

发消息 + 关注

发表于2020年04月22日 15:26:25 827 2
直达本楼层的链接
楼主
显示全部楼层
[技术干货] 0x00 LiteOS_Lab仓库组件详解--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等),比较精巧,一整套内核(包括了任务调度等等功能)
osal os抽象层,给其他组件调用(at、shell等等),可以看下面的结构图理解调用关系
ucosii ucosii比较经典的内核之一
Readme.me os组件的介绍
kconfig_os 用于图形化配置os组件
os.mk 用于根据配置控制编译os的组件

组件调用关系图:image.png

二、详解OSAL层

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

image.png

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

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类型的函数

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

举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

EnyaSeven

发帖: 69粉丝: 45

发消息 + 关注

发表于2020年04月22日 17:45:37
直达本楼层的链接
沙发
显示全部楼层

评论
樊心昊 2020-4-22 18:34 评论

感谢支持!

... 查看全部
点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

我是卤蛋

发帖: 121粉丝: 292

级别 : 版主,版块专家

发消息 + 关注

发表于2020年06月26日 11:14:56
直达本楼层的链接
板凳
显示全部楼层

感谢分享,持续学习~

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200