Rex (Real-Time Executive)

Slides:



Advertisements
Similar presentations
環境游離輻射 ( 六 ) 輻射與核能發電. 媽!這是我上班的 地方-核電廠。 地方好寬闊喔! 聽說日本原子彈爆炸死好幾 萬人,阿榮啊!你在這裡上 班,安全嗎?
Advertisements

高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
《小狗包弟 》之 从阅读到写作 学校:和风中学 年级:高一 参赛者:彭龙英. 预习检测一 思考:同学们读完作者与包弟 的故事后,说一说作者所表达的情 感是什么?
虹膜识别健康养老服务智能系统项目.
探究活动课:互联网+历史素材阅读与研讨 古代中国的选官制度 黄天庆  探究活动课:互联网+历史素材阅读与研讨 古代中国的选官制度 黄天庆 
两汉文学及汉代诗歌.
職校、五專群科簡介.
近现代文学概说.
江苏省工程造价管理协会 工作报告 2015年4月21日 扬州.
101年8月份 嘉義市道路交通安全聯席會報 酒駕行為與肇事現況分析 主講人:內政部警政署交通組科長張夢麟 1.
高校邦在线学习平台 学生学习手册 北京高校邦科技有限公司.
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
Nucleus嵌入式操作系统.
契約 課程:文書實務與應用 教師:黃湃翔老師.
Using C++ The Weird Way Something about c++11 & OOP tricks
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
职团客户促销活动 2018年04月.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
Linked List Operations
VxWorks软硬件设计及实例分析
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
程序设计期末复习 黎金宁
6.4 Notification 通知栏.
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
辅导课程六.
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
奢侈稅成效分析與房市未來發展 吳中書 中華經濟研究院 第十九屆亞太財務經濟會計及管理會議 ~07.09.
进程操作.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
Windows网络操作系统管理 ——Windows Server 2008 R2.
按键驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
如何生成设备节点 广州创龙电子科技有限公司
职团客户促销活动 2018年01月.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
DQMClientDim.cxx及双光子练习
职团客户促销活动 2018年03月.
本节内容 消息的分发 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
年所得12万以上自行纳税申报 信息管理科 张沛.
分裂对象模型 C++ otcl.
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
解决“最后1公里”问题.
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 消息的接收 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Presentation transcript:

Rex (Real-Time Executive)

高通平台的结构

Rex 简介 REX是一个实时的抢占式操作系统. 每个REX任务都独立地由REX内核调度,每个任务都有一个数据结构rex_tcb_struct.TCBs按优先级顺序编排在一个单一的链表中 ----活动的和挂起的任务在同一个列表中.每个任务将一直执行到下列事件之一发生而进行上下文的切换. 自愿挂起如执行rex_wait or rex_timed_wiat 在高优先级的挂起任务里设置了一个信号 产生了一个更高优先级的任务. 一个正在执行的任务使另外一个任务的优先级比它的优先级高 中断产生并且ISR切换进优先级比被中断的任务优先级高的任务中 REX的允许任务的优先级范围为1到65535,1是最低优先级,优先级为0预留给空闲任务使用.没有两个及两个以上的任务具有相同的优先级.

Rex操作系统 任务API: rex_def_task 优先级API: rex_set_pri,rex_task_pri,rex_get_pri. REX的信号工作原理:Rex的信号主要集中在TCB的两个Field: Sigs:是一个掩码,包括给定任务已经设置的信号 Wait:是一个掩码,包括一些信号,一旦这些信号被设置,任务就挂起. 信号的函数有: rex_wait(), rex_set_sigs().rex_get_sigs(),rex_clr_sigs() REX Timers:活动的REX计时器是一个具有rex_timer_struct结构的双向链表.使用REX计时器的任务先分配一个rex_timer_struct,然后调用rex_def_timer. Rex_set_timer启动一个计时器. 中断处理:IRQ处理器调用tramp_isr,然后决定哪个中断产生.

Rex task之间交互 任务间的通信是通过队列和信号量来完成的. 想丛其他任务接受消息的任务生成一个全局命令队列和一个与队列相关的信号 想丛其他任务发送消息的任务: 获取目标任务相关的类型的一个命令的Buffer. 完成合适区域的填充 把消息排队到命令队列中 为该命令设置相关的信号

Rex task之间交互(Cont.) 通常,队列操作和设置信号被封装成一个函数。

Rex task之间交互(Cont.)

Rex task与BREW之间交互 方法一:postEvent方法,在Rex某个task中直接调用ISHELL_PostEventEx或者ISHELL_PostEvent <注1> ISHELL_PostEventEx主要的区别在于,此函数允许向同一个小程序传递同一类型的多个事件(同一事件代码)并让事件排队等待分发。

Rex task与BREW之间交互(Cont.) <注2>如果ISHELL_PostEventEx最后一个参数为一个指针的话,一定要注意该指针指向的内存。在高通平台中调用不同的malloc或者MALLOC分配的内存可能来自不同的堆,释放的时候,必须到用相应的释放函数。所以我们在调用ISHELL_PostEventEx之前,先要把数据拷贝一份,到上层app收到这个消息的时候,释放该备份的内存。

Rex task与BREW之间交互(Cont.)

Rex task与BREW之间交互(Cont.) eg: void WMSAPP_CfgCb(uint16 event, wms_cfg *pInfo) { sms_cfg=MALLOC(sizeof(wms_cfg)); MEMCPY(sms_cfg, pInfo, sizeof(wms_cfg)); ISHELL_PostEventEx(pShell, EVTFLG_ASYNC, clsID, event, sms_cfg); } 初始化的时候,调用wms_client_reg_msg_cb(ID, WMSAPP_CfgCb);

Rex task与BREW之间交互(Cont.) 方法二:基本同方法,回调中调用AEE_ResumeCallback而 不是PostEventEx

BREW与Service交互实例 struct IWMS{ AEEVTBL(IWMS) *pvt; IShell *m_pIShell; AEECLSID m_cls; //no use uint32 m_uRefs; //引用计数 }; typedef struct{ AEEApplet a; IWMS *m_pwms; … }CWMSAPP; ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_WMS, (void **)&pMe->m_pwms); //创建wms接口,首先通过 gOEMStaticClassList找到OEMWMS_New

BREW与Service交互实例(Cont.) static const AEEStaticClass gOEMStaticCLassList[] = { {AEECLSID_WMS, ASCF_PRIV, 0, NULL, OEMWMS_New}, }; OEMWMS_New分析(OEMWMS.) static struct IWMS *IWMSobj = NULL;//局部全局变量 int OEMWMS_New(IShell *pIShell, AEECLSID cls,void **ppif) ... ;//参数合法性检查 if (IWMSobj == NULL) if ((IWMSobj = (IWMS*)OEM_Malloc(sizeof(IWMS))) == NULL) { return ENOMEMORY; }

BREW与Service交互实例(Cont.) IWMSobj->pvt = (IWMSVtbl *)&gOEMWMSFuncs; IWMSobj->m_pIShell = pIShell; IWMSobj->m_cls = cls; IWMSobj->m_uRefs = 1; *ppif = IWMSobj; } else { (void *)OEMWMS_AddRef(IWMSobj); *ppif = IWMSobj; } return AEE_SUCCESS

BREW与Service交互实例(Cont.) static const AEEVTBL(IWMS) gOEMWMSFuncs = { OEMWMS_AddRef ,OEMWMS_Release ,OEMWMS_QueryInterface ,OEMWMS_Init ,... OEMWMS_MsgDeleteAllExt };

BREW与Service交互实例(Cont.) #define IWMS_AddRef(p) \ AEEGETPVTBL(p, IWMS)->AddRef(p) 调用IWMS_AddRef实际上就是调用OEMWMS_AddRef

BREW与Service交互实例(Cont.) 上层BREW应用调用IWMS_MsgRead (AEEWMS.h),属于BREW AEE层。 IWMS_MsgRead实际上就是调用OEMWMS_MsgRead (OEMWMS.c),属于BREW OEM层。 在OEMWMS_MsgRead函数中,调用wms_msg_read (wms.c, 属于service层)给wms_task发一个CMD。 wms_status_e_type wms_msg_read( wms_client_id_type client_id, wms_cmd_cb_type cmd_cb, const void *user_data, wms_memory_store_e_type mem_store, wms_message_index_type index)

BREW与Service交互实例(Cont.) { wms_status_e_type st = WMS_OK_S; wms_cmd_type *cmd_ptr; cmd_backup.hdr.cmd_id = WMS_CMD_MSG_READ; cmd_backup.hdr.client_id = client_id; cmd_backup.hdr.cmd_cb = cmd_cb; cmd_backup.hdr.user_data = (void*)user_data; cmd_backup.cmd.msg_read.mem_store = mem_store; cmd_backup.cmd.msg_read.index = index; //cmd_backup赋值 cmd_ptr = wms_get_cmd_buf(); //从队列中取出一个元素

BREW与Service交互实例(Cont.) if (cmd_ptr != NULL) { *cmd_ptr = cmd_backup; wms_put_cmd(cmd_ptr); //消息插入到到队列中,并设置信号 }else{ wms_client_cmd_status(&cmd_backup, WMS_CMD_ERR_NO_RESOURCE); //回调错误消息 st = WMS_OUT_OF_RESOURCES_S; } return st;

BREW与Service交互实例(Cont.) 以上函数的执行环境为ui_task,当调用wms_put_cmd这个函数的时候, wms_task会收到WMS_CMD_Q_SIG,其相应的环境会转化wms_task。 当wms_task处理完毕后,会调用app注册的回调函数(向app层事件) void WMSAPP_CfgCb(uint16 event, wms_cfg *pInfo) { sms_cfg=MALLOC(sizeof(wms_cfg)); MEMCPY(sms_cfg, pInfo, sizeof(wms_cfg)); ISHELL_PostEventEx(pShell, EVTFLG_ASYNC, clsID, event, sms_cfg); }

BREW与Service交互实例(Cont.) ISHELL_PostEventEx发的事件,BREW收到事件(执行环境从wms_task转到ui_task)

BREW与Service交互实例(Cont.)

Thanks!