0x00 LiteOS_Lab仓库组件详解--OS
【摘要】 摘要:之前我们在汇总帖中讨论过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等),比较精巧,一整套内核(包括了任务调度等等功能) |
osal | os抽象层,给其他组件调用(at、shell等等),可以看下面的结构图理解调用关系 |
ucosii | ucosii比较经典的内核之一 |
Readme.me | os组件的介绍 |
kconfig_os | 用于图形化配置os组件 |
os.mk | 用于根据配置控制编译os的组件 |
组件调用关系图:
二、详解OSAL层
由于篇幅有限,只能列举部分函数,以任务相关的函数为主。
这些函数都在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结构体中:
并将s_liteos_ops结构体指针存到tag_os类型的s_link_liteos结构体中:
最后调用osal_install函数完成注册:
其他函数大家可以以此类推。
PS:文章到这里就算写完了,如果有疑问请留言,或者又想听的内容也尽管留言!如果对你有帮助也希望能点个赞或者留个言,这是对我最大的鼓励!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)