Gogoto OS嵌入式实时操作系统

fr8016 sdk源码结构和开发方式 下面的代码中,user_task_func是一个任务,需要被其他任务通过事件驱动,当其他任务调用os_msg_post向user_task_func发送os_event_t时,user_task_func得到执行。sdk开发中,任务采用事件驱动,不同任务间通过消息os_event_t *进行通信,当任务A产生的事件可以驱动任务B时,任务A通过os_msg_post向任务B发送消息,任务B接收消息,并从消息中获取事件id和数据,根据事件id做相应的处理。下面按照协议栈处理流程给出接口的说明。 阅读详情

 

基于消息机制的Gogoto OS嵌入式实时操作系统说明书

(G-OS)

作者:卢益贵   QQ:48092788

博客:luyigui.blog.gxsky.com

网络搜索:绿城代码、Gogoto OS、狗狗兔

 

 

 

一、        许可协议

1.  版权所有,未经授权不得用于任何商业行为;

2.  任何获得授权使用的单位和个人,都必须保持原有的文件内容、文件名和目录结构;

3.  作者保留对本系统的版本发布权,任何对本系统的修改、完善、升级等版本都必须提供给作者,由作者统一发布;

4.  由于软件具有不可预见性的错误,作者不对此负责;

5.  任何移植的个人或单位,都必须向作者提供移植版本的所有代码,否则作者保留追究其侵权的权力;

6.  由于代码的算法可能具有雷同性,如有侵权的部分,请立即向作者说明,立即更改;

7.与本系统的代码交流,均以作者提供的博客为平台。

 

 

二、        文件结构

1.  GGT_CPU_a.s:CPU相关的汇编核心代码部分

2.  GGT_CPU_c.c:CPU相关的C核心代码部分

3.  GGT_CPU.h:CPU相关的头文件部分

4.  GGT_Kernel.c:CPU无关的核心代码部分

5.  GGT_Type.h:变量类型定义

6.  GGT_SysType.h:仅提供给系统的类型定义

7.  GGT_SysCfg.h:功能模块使能头文件

8.  GGT_OS.h:提供给用户引用的头文件

9.  GGT_Kernel.h:仅提供给系统引用的所以功能头文件

10.              GGT_Mut.c:任务排斥功能单元:

11.              GGT_Msg.c:消息功能单元

12.              GGT_Timer.c:用户定时器功能单元

13.              GGT_Mem.c:简单内存功能单元

14.              GGT_Func.c:功能 函数单元

15.              GGT_Config.c:用户配置单元

16.              GGT_Config.h:用户配置单元头文件

 

 

三、        设计说明

本系统设计基于消息传送机制,采用完全的32位变量数据,具有时间片任务分配切换功能,本系统的设计考虑到了移植和项目开发的各异性,在结构上为两者留有了空间,用户可以根据不同需求更改设置。系统的创新点在于,一切任务间的数据交换都采用消息机制。尽管也有很多系统具有消息功能,但是各有优势。

 

本系统的链表结构采用了统一的头成员为下一个节点指针的形式,统一了链表功能函数,在内存分配的处理上,采用别人的MemBox机制。在系统节拍的实现代码部分,已经进行了代码优化,最大限度的保障了没有必要的判断,提高了使用频率高的代码的效率。

 

 

四、        移植说明

本系统的移植,仅对三个文件进行更改即可:

1.  GGT_CPU_a.s:CPU相关的汇编核心代码部分

2.  GGT_CPU_c.c:CPU相关的C核心代码部分

3.  GGT_CPU.h:CPU相关的头文件部分

GGT_CPU_a.s是软件中断代码部分,主要是软件中断切换任务和开关IRQ中断功能,因为在代码执行时,需要对CPU进行独占,所以必须提供开关IRQ中断的功能,以防止IRQ中断对程序执行代码切分后,造成公共数据的数据不一致的情况。

GGT_CPU_c.c是和CPU或编译器相关的代码部分,实现了系统时钟节拍的功能,在时钟中断里面,必须保存当前任务环境,进行任务调度和定时器计数,和进行新任务环境的加载。由于不同的编译器,堆栈的结构也不一样,因此对堆栈的初始化也在这里进行。本系统设计将C语言的Main函数纳入了系统的默认任务,因此,在这个部分,也对系统的默认堆栈指针进行了巧妙的替换,达到了将Main函数设置为任务体的目的。

在进行任务切换前,都必须保证pOSTskReady不为空,如果没有任务,必须让默认的Main任务出列,进入就绪状态,以保证必须有任务维持系统的运转。在main任务里面,死循环的对CPU进行了休眠处理。

 

 

五、        使用说明

1)本系统在Keil编译器上编译通过,并在LPC2106芯片运转良好,注意:编译设置里面必须把Keil的Use Thumb Mode选项去掉。

2)由于本系统使用了main函数,用户不能再有main函数体,系统提供了umain函数来给用户初始化用户系统:

void umian(void)

{

        OSTaskCreate(…);

        ……

}

任务函数的格式:

Void TaskBody(UINT32 Param)

{

        _Msg Msg;

        Param = 0;

        While(1)

        {

               If(OSMsgWait(&Msg))  如果不想让任务吊死的话,可以使用OSMsgPeek

               {

                      Switch(Msg.Msg)

                      {

                             ……

                      }

               }

}

}

 

3)用户函数(原形可看源文件):

1.  extern UINT32 OSTaskUserCreate(void(*pTaskBody)(UINT32 Param), UINT32 Param, const UINT32 Prio, UINT32 Mode);

2.  extern UINT32 OSTaskCreate(void(*pTaskBody)(UINT32 Param), UINT32 Param, const UINT32 Prio);

3.  extern void Suspend(UINT32 TaskID);

4.  extern BOOL Resume(UINT32 TaskID);

5.  extern UINT32 OSTaskSelf(void);

6.  extern void OSTaskKill(UINT32 TaskID);

7.  void OSTaskDelay(UINT32 Time);

8.  #define OSTaskKillSelf           OSTaskKill(OSTaskSelf())

9.   

10.              extern void ListFirst(void *pFirst, void *pNode);

11.              extern void ListAppend(void *pFirst, void *pNode);

12.              extern void ListDelete(void *pFirst, void *pNode);

13.              extern void ListInsert(void *pFirst, void *pNode,

14.                                          BOOL (*pIsHere)(void *pNode, void *pNodeIns));

15.               

16.              extern void BoxInit(void *pBoxMem, INT32 BoxSize, INT32 BlockSize);

17.              extern void *BoxAlloc(void *pBoxMem);

18.              extern void BoxFree(void *pBomMem, void *Box);

19.               

20.              extern void OSMutWait(_pOSMut pMut);

21.              extern void OSMutRelease(_pOSMut pMut);

22.              extern void OSMutInit(_pOSMut pMut);

23.               

24.              extern BOOL OSMsgWaitFor(const UINT32 Msg, _pMsg pMsg);

25.              extern BOOL OSMsgWait(_pMsg pMsg);

26.              extern BOOL OSMsgPeek(_pMsg pMsg);

27.              extern BOOL OSMsgPost(const UINT32 TaskID, const UINT32 Msg, const UINT32 wParam, const UINT32 lParam);

28.               

29.              void OSTimerKill(const UINT32 TimerID);

30.              BOOL OSTimerSet(const UINT32 TaskID, const UINT32 Time);

4)由于本系统设计于单片机,为了节省处理时间和减少代码量,很多函数没有对参数的有效值进行过滤,在使用时,必须按照声明的要求使用。

 

 

 

FreeSWITCH彩铃与回铃音区别详解:从183/180信令到mod_da2检测模块 本文深入解析FreeSWITCH中彩铃与回铃音的技术差异,从183/180信令机制到mod_da2智能检测模块的实现原理。通过对比SIP协议中的早期媒体传输、回铃音补偿技术及实战案例,帮助开发者掌握VoIP系统中的关键音频处理技术,提升呼叫系统稳定性和用户体验。 阅读详情

相关推荐

Nordic nRF52832实战:手把手教你搭建智能手环BLE通信框架(附完整代码)

本文详细介绍了如何使用Nordic nRF52832芯片搭建智能手环的BLE通信框架,涵盖芯片优势、协议栈初始化、低功耗广播策略及健康数据服务实现。通过完整代码示例和架构设计,帮助开发者快速掌握蓝牙低功耗通信技术,适用于可穿戴设备开发。

weixin_29192141的博客 246

uCOS任务消息队列相关函数理解

uCOS任务消息队列相关函数理解

m0_43443861的博客 746

pyinstaller+scrapy打包出现错误:OSError: could not get source code

错误如下: Traceback (most recent call last): File "scrapy\utils\defer.py", line 55, in mustbe_deferred File "scrapy\core\spidermw.py", line 60, in process_spider_input File "scrapy\core\scraper.py", line 152, in call_spider File "scrapy\utils\misc.py

kin的博客 1758

想象G os linux搞什么?我下载了开发版看了后的感想

gos-base-8041-20080806.iso 我在自己的虚拟光驱里加载的时候      惊奇的发现,他采用了ubuntu 8.04的版本也就算了 连自动播放功能仍然是ubuntu的界面,什么都没变   我真不知道他的发行到底有什么意义?   

踏踏实实做人、勤勤奋奋做事 662

Vue3结合vue-office实现Word文档上传与预览全流程解析

本文详细解析了如何在Vue3项目中集成vue-office插件实现Word文档上传与预览功能。从项目初始化、插件安装到文件上传处理(包括ArrayBuffer转换)、预览优化及常见问题解决方案,提供了一套完整的实现流程,帮助开发者快速实现高效的文档预览功能。

weixin_29001327的博客 464

IGS精密星历高效获取与解析指南

本文详细介绍了IGS精密星历在高精度定位中的核心作用,对比了IGS Final、IGR和IGU等不同产品的精度与时效性差异。指南提供了从武汉大学、NASA CDDIS等数据中心高效下载数据的实战方法,并深入解析了SP3文件格式,帮助用户掌握精密星历的获取、解析与自动化处理技巧,以支持厘米级定位应用。

garlic的博客 836

osal_msg_send 以及OSAL消息发送示例

TI z-stack协议栈中加入了RTOS,所以整个协议栈的各层功能的实现是以OS的Task形式调用的 一、用于发送消息的函数为osal_msg_send 原型:OSAL.c中 uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); 参数destination_task为要接收此Message的目标任

u013951778的博客 1129

记录:rk3568适配开源GPU驱动(panfrost)

摘要:本文介绍了在RK3568芯片上移植Mali-G52 GPU驱动的过程。主要包括内核dts文件修改和内核配置调整两部分。

xuesong10210的博客 2233

uC/OS任务信号量

在实际任务间的通信中,一个或多个任务发送一个信号量或者消息给另一个任务是比常见的,而一个任务给多个任务发送信号量和消息相对比较少。前面所讲的信号量和消息队列均是单独的内核对象,是独立于任务存在的。这两章要讲述的任务信号量和任务消息队列是 任务特有的属性,紧紧依赖于一个特定任务。   任务信号量和任务消息队列分别与多值信号量和消息队列非常相似,不同之处是,前者仅发布给一个特定任务,而后者可以发布给多个任务。因此,前者的操作相对比较简单,而且省时。如果任务信号量和任务消息队列可以满足设计需求,那么尽量不要使用

weixin_41040351的博客 542

携程酒店数据爬取进阶:动态接口破解与反反爬策略实战

本文详细解析了携程酒店数据爬取的进阶技巧,包括动态接口参数破解、反爬虫策略对抗及企业级采集方案实现。重点介绍了eleven参数的生成逻辑、动态Cookie维护方法,以及如何应对携程的请求指纹检测和行为模式识别。通过实战案例,帮助开发者高效获取酒店价格数据,同时遵守行业规范。

eee77的博客 1078

告别MATLAB!用Python的PYPOWER搞定电力系统潮流计算(附Case30完整代码)

本文介绍了如何从MATLAB迁移到Python,使用PYPOWER工具包进行电力系统潮流计算。通过详细的环境准备、数据接口兼容性实践、潮流计算实现及最优潮流计算进阶,帮助工程师和学生无缝过渡到Python生态。文章还展示了结果处理与可视化技巧,并附有Case30完整代码示例。

weixin_30411819的博客 297

Nginx反向代理和负载均衡

3台Centos 192.168.137.128 (Nginx) 192.168.137.129(Tomcat 端口8080) 192.168.137.131(Tomcat 端口8080) (如果复制的VM的网卡不可用 可删除/etc/udev/rules.d/70-persistent-net.rules 文件 我的是70开头,有的不一样 可以执行 echo null >> 70-pe

elsery 1213

cst使用局部网格加密,手动加密,special设置等方法合理网格布局加速仿真速度

在CST中,计算复杂模型或者阵列的时候往往需要耗费大量仿真时间,除了使用更高性能的电脑或工作站进行仿真,合理对CST的仿真网格进行适当设置也是必不可少的一步。CST中网格设置影响模拟的精度和速度,因此花时间理解网格过程是很重要的。

OVEN_b612的博客 1万+

UCOSIII总结------消息队列(6)

这节总结操作系统UCOSIII的内核对象------->消息队列 问题1 什么是消息队列 消息队列是一个结构体其类型就是OS_Q typedef struct os_q OS_Q; 展开看看结构体成员 struct os_q { /* Message Queue / OS_OBJ_

chenbinchao的博客 1390

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

消息队列

多值信号量和和互斥信号量主要用来标志事件是否发生和协调资源的访问。如果要给资源赋予内容进行传递,信号量就力有所不及了。这时候就需要用到 uC/OS 操作系统的另一个内核机制了,那就是消息队列。   如果想要使用消息队列,就必须事先使能消息队列。消息队列的使能位于“os_cfg.h”。 /* ---...

weixin_30825581的博客 428

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ucosIII 消息传递

导读: 一共分为三部分:>第一部分:任务调度,讲述了任务级和中断级的任务调度和调度点>第二部分:任务切换>第三部分:系统初始化部分。重点在于第三部分代码讲解 任务间通信一个任务或者中断服务程序有时候需要和另一个任务交流信息,这个就是消息传递的过程就叫做任务间通信,任务间的消息传递可以通过2种途径:一是通过全局变量,二是通过发布消息。 使用全局变量的时候每个任务或者中断服务程序都必须保证其对全

feather(猎羽) 4888

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【UCOSIII操作系统】消息队列篇(1)消息队列

UCOSIII操作系统UCOSIII操作系统——消息队列篇(1)消息队列消息队列常用函数消息队列概念简介创建消息队列->OSQCreate()消息队列删除->OSQDel()消息队列发送->OSQPost()消息队列获取->OSQPend() UCOSIII其他内容导航不迷路 UCOSIII操作系统-简介 UCOSIII操作系统——任务篇(1)创建任务 UCOSIII操作系......

不知道在干嘛每天 5364

uC/OSIII的消息队列处理机制

在uC/OSIII中没有邮箱这个概念,而是统一合并到了消息队列MSG_Q。因为消息队列可以看作是很多邮箱的集合,邮箱只是包含单个消息的消息队列。 在分析消息队列之前,必须要对消息的数据结构做一个彻底的分析。 消息队列对象和其他内核对象一样,它的结构定义很简单: 下面看一下消息队列的结构体,记住这个结构体名字叫OS_Q: struct os_q { /* Message Queue */

BlairFee的博客 2618

TencentOS-tiny 任务间通信(八)- 消息队列

一、任务间通信 1、消息队列 概述 消息队列提供了任务间传递指针数据的机制,所谓的“消息“就是指针。消息本身如何解析使用,由传递消息的两个任务自行规定,消息队列不对消息本身做任何规定和限制,消息队列仅承担指针数据的传递义务。 API讲解 编程实例 1、在tos_config.h中,配置消息队列组件开关TOS_CFG_MESSAGE_QUEUE_EN: #define TOS_CFG_...

qq_36075612的博客 1万+

OSMboxPost ()

#if OS_MBOX_POST_EN > 0INT8U  OSMboxPost (OS_EVENT *pevent, void *msg){#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */    OS_CPU_SR  cpu_sr;#e

silenceee的专栏 3098

用“卡尔曼滤波器”来处理“加速度计数据”(加速度,陀螺仪调试)

关键词:SCA3000,ADIS16255,加速度计、陀螺仪数据计算处理算法,卡尔曼滤波器、扩展卡尔曼滤波器。关键词:加速度计和陀螺仪驱动,SCA3000,ADIS16250,ADIS16255,温度、重力加速度、角速度计算方法,SPI总线,SCA3000 模式设置(Mode)、参数设置、读写,ADIS16255读写、参数设置,陀螺仪数据处理 SCA3000,ADIS16255,加速度计、陀螺

码客 卢益贵 ygluu 2万+

linux安装nginx并设置https(openssl)

一、安装依赖包 1.$sudo apt-get install openssl    或者$sudo apt-get install libssl-dev 2.$sudo apt-get install libpcre3 libpcre3-dev 二、安装nginx 1.$cd /usr/local/src 2.sudo wget http://nginx.org/download

码客 卢益贵 ygluu 2万+

高性能的socket通讯服务器(完成端口模型--IOCP)

关键词:delphi socket通讯服务器例程(完成端口模型--IOCP)、I/O Completion Port、socket通讯登峰造极、IO重叠、 IOCP客户服务端         高性能的socket通讯服务器(完成端口模型--IOCP)       很多人费尽心思,都没有找到一个完美的 I/O CP 例程,甚至跟人于误解,先将本人编写的例程

码客 卢益贵 ygluu 1万+

强大的TcpServer压力测试工具源码(附突破连接限制的方法和工具)

      强大的TcpServer压力测试工具源码(附突破连接限制的方法和工具)关键词:IOCP TcpServer TcpClient 完成端口服务器达到6万连接突破连接限制压力测试工具堵塞锁非堵塞锁无锁 Lock Free 并发队列并发可扩充环形队列首先感谢在行动和精神上给予本人支持的各位同行,在过去的日子,使得本人的IOCP研究进入了崭新的领域。本文及附件希望能给予更多人的帮助,限于商用等原因,除了原来的0.85版开源之外,更高版本不便开源,仅简单描述一些技术要点,请谅解。但附件的压力工具源码,仍然

码客 卢益贵 ygluu 1万+

G-Sockets(IOCP) 2.5 Demo 源码 (VC2008 & Delphi7/2010)下载

       G-Sockets(IOCP)最新版本的Iocp Tcp Server 完成端口服务器通讯模块Demo源码及技术文档,包括粘包处理源码、客户端突破6W连接限制的文档、强大的服务器(Tcp Server)压力测试工具及无限制的EXE服务器程序(供体验测试)。        有关Iocp技术请阅读本博客其他帖子。        声明:未授权的DLL或LIB,是限制版,本人不保证它能正...

码客 卢益贵 ygluu 1万+

功能强大的IOCP Socket Server模块源码——完成端口通讯服务器(IOCP Socket Server)设计(六)

完成端口通讯服务器(IOCP Socket Server)设计(六)功能强大的IOCP Socket Servre模块例程源码Copyright © 2009 代码客(卢益贵)版权所有QQ:48092788   源码博客:http://blog.youkuaiyun.com/guestcode 本文论坛讨论:http://topic.youkuaiyun.com/u/20090921/11/69fe462

码客 卢益贵 ygluu 1万+
上一篇: 高性能的socket通讯服务器(完成端口模型--IOCP)
下一篇: Windows mobile 透明/半透明控件组(皮肤控件)
ygluu
博客等级 码龄17年 300粉丝 62原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值