一个面向MCU的小型前后台系统

JxOS简介

JxOS面向MCU的小型前后台系统,提供消息、事件等服务,以及软件定时器,低功耗管理,按键,led等常用功能模块。

gitee仓库地址为(复制到浏览器打开):

https://gitee.com/jeremyceng/JxOS/tree/master

在此基础上实现了基于433的简单无线网络功能。

此项目的设计思想是:功能模块与硬件高度解耦,提高代码模块的可复用性;不使用复杂的数据结构和语法以提高不同硬件平台和编译器之间的兼容性,实现工程在不同MCU之间的快速移植;提供实用稳定常用的功能模块,实现项目的快速开发;定义标准应用开发框架,减轻应用开发的工作量和难度。

已使用此系统用于开发项目的硬件平台有:N76E003、STM8S103K、PC、KF8TS2716

Software Architecture

JxOS
├───demo_code    参考代码,未整理代码
│
├───jxos     jxos
│   ├───bsp     过时分类,将逐步归类到 driver 和 lib 中
│   ├───kernel    内核,提供系统内核功能:任务、事件、消息、公告板、邮箱、管道、注册、内存分配……
│   ├───driver    使用 静态 初始化的功能代码模块,使用config.h文件进行配置;此目录下的代码大部分与硬件相关,如:传感器、按键扫描、屏幕…… (driver 与 lib 有时并没有清晰的界限,如driver:led_blink 就有可能抽象成 lib:sw_pwm)
│   ├───lib     使用 动态 初始化的功能代码模块,使用初始化函数进行配置;此目录下的模代码大部分与硬件无关,如:环形缓冲区、crc16、栈、软件定时器…… 
│   ├───sys_service   基于任务实现的系统服务,如:低功耗管理、软件定时器、打印输出……(只有对外接口,不发出对外消息)
│   └───std_app    基于任务实现的常用标准应用,如独立按键扫描、按键多次点击、指示灯闪烁……(此类模块和user app属于同一级别,只不过已经标准化;此类模块发出对外消息,也有对外接口,用于兼容不能支持消息功能的硬件平台)
│
├───platform
│   ├───N76E003    ┐
│   ├───N76E003    ├───  基于 jxos 实现的,使用不同平台硬件的具体项目
│   └───STM8S103K3 ┘
│
├───JSnet   ┐
├───....    ├───   基于 jxos 实现的功能模块
└───SRTnet  ┘
  1. kernel 提供系统内核功能:任务、事件、消息、公告板、邮箱、管道、注册、内存分配……
  2. driver 使用 静态 初始化的功能代码模块,使用config.h文件进行配置;此目录下的代码大部分与硬件相关,如:传感器、按键扫描、屏幕…… (driver 与 lib 有时并没有清晰的界限,如driver:led_blink 就有可能抽象成 lib:sw_pwm)
  3. lib 使用 动态 初始化的功能代码模块,使用初始化函数进行配置;此目录下的模代码大部分与硬件无关,如:环形缓冲区、crc16、栈、软件定时器……
  4. sys_service 基于任务实现的系统服务,如:低功耗管理、软件定时器、打印输出……(只有对外接口,不发出对外消息)
  5. std_app 基于任务实现的常用标准应用,如独立按键扫描、按键多次点击、指示灯闪烁…… (此类模块和user app属于同一级别,只不过已经标准化;此类模块发出对外消息,也有对外接口,用于兼容不能支持消息功能的硬件平台)
  6. platform 基于 jxos 实现的,使用不同平台硬件的具体项目
  7. 在某些编译器环境下可能出现以某些限制(不支持函数指针,不支持中断处理函数中调用其他函数,不支持函数指针带参数,不支持结构体),因此 std_app 提供的消息可能无法使用,作为补充std_app 也会同时提供全局变量来传出信息和函数接口来传入信息
  8. 为提高代码的兼容性;尽量不要使用函数指针
  9. 为提高代码的可复用性,std_app 中的功能尽量在 driver 和 lib 中实现,std_app 中的代码仅作为提供系统tick和统一对外接口的功能
  10. 模块和 std_app 可以提供多个不同实现方法的文件,但保持对外接口的统一
  11. 对外提供两套接口方案 jxos_public.h 提供高级接口(消息 事件等),jxos_public_lite.h 提供低级接口(全局变量, 函数)

  资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

Instructions

  1. 导入 jxos_public.h 即可调用系统所有的对外接口
  2. 每个项目通过 jxos_init_config.c 和 jxos_config.h 对系统进行配置,即每个项目有独立配置文件
  3. 在 jxos_init_config.c 实现需要硬件支持的系统模块硬件初始化,以及用户任务的初始化顺序
  4. 在 jxos_config.h 配置系统模块的参数和使能
  5. event 用于任务内部的信号同步,主要是将中断信号传递到任务
  6. msg 用于任务之间的消息传递,使用 jxos_msg_get_handle 可通过消息名(字符串)获取消息句柄
如何建立新项目:获取 Jxos 所有文件和目录结构在 \platform 目录下建立当前工程的目录(platform\芯片型号\工程命名\)在 \工程名称 目录下新建工程文件(keil、iar 等IDE的newproject)在 \工程名称 目录下新建 \config 目录,增加 jxos_config.h type.h 系统配置文件在 \config 目录下增加工程用到的功能模块的配置文件 (如 button_config.h sim_timer_config.h ...)在 \工程名称 目录下新建 \framework 目录在 \framework 目录下增加 main.c ,实现main函数,在main函数中调用jxos_run() ( void main(void) {jxos_run();} )在 \framework 目录下增加 isr.c ,实现工程需要的中断处理函数在 \framework 目录下增加 callback_handler.c ,实现工程用到的功能模块的callback函数建议在 \工程名称 目录下新建 \app 目录,实现用户功能任务建议在 \芯片型号 目录下增加芯片需要用到的库文件目录在IDE的新工程中导入 jxos.c在IDE的新工程中导入需要的Jxos模块的文件(kernel、sys_service ...)在IDE的新工程中导入 main.c, isr.c, callback_handler.c在IDE的新工程中导入用户任务文件 (\工程名称\app\)在IDE的新工程中增加include目录,包括:\joxs,\platform\芯片型号\工程命名\config在IDE的新工程中增加其他的include目录,如芯片库文件的头文件按照框架实现用户任务如何配置与使用 kernel
如何配置与使用 sys_service
如何配置与使用 std_app
如何使用标准框架的 driver 模块
如何使用标准框架的 lib 模块

原文作者:【一起学嵌入式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/94437.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备份迁移数据库

记录下备份迁移数据库的经历。 使用工具sqldump和mysql 1、sqldump导出数据 #导出整个数据库 sudo mysqldump -uroot -p123456 database > database.sql#导出数据库中某个表 sudo mysqldump -uroot -p123456 database table1 > database.sql#导出数据库中多个表 sudo …

Redis 缓存穿透、击穿、雪崩

一、缓存穿透 1、含义 缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。 2、解决方案 1)缓存空对象 就是当数据库中查不到数据的时候,我缓存一个空对象…

ARM Cortex-M 的 SP

文章目录 1、栈2、栈操作3、Cortex-M中的栈4、MDK中的SP操作流程5、Micro-Lib的SP差别1. 使用 Micro-Lib2. 未使用 Micro-Lib 在嵌入式开发中,堆栈是一个很基础,同时也是非常重要的名词,堆栈可分为堆 (Heap) 和栈 (Stack) 。 栈(Stack): 一种…

Android安卓实战项目(13)---记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用!!!(源码在文末)

Android安卓实战项目(13)—记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用!!!(源码在文末🐕🐕🐕) 一.项目运行介绍 B站…

LeetCode-455-分发饼干-贪心算法

题目描述: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j&#xff…

2023年王炸面试题每日一练--为什么会有精度的损失

基本数据类型中为什么会出现精度损失,怎么样会避免出现精度损失 loat 32位 出现精度损失的原因: 输入的值为十进制,而在计算的过程中,是要把十进制的小数位值在有限位的情况下转变为二进制的小数,就会出现精度的损失…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 教学视频[3] 为什么要学习 ES? 强大的全文搜索和检索功能:Elasticsearch 是一个开源的分布式搜索和分析引擎,使用倒排索引和分布式计算等技术,提供了强大的全文搜索和检索功能。学习 ES 可以掌…

Node 执行命令时传参 process.argv

process 对象是一个全局变量,提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程。 因为是全局变量,所以无需使用 require()。 process.argv 属性返回一个数组,这个数组包含了启动Node.js进程时的命令行参数&#xff0c…

你知道用Woof创建的Linux吗?

Quirky 8.2 已发布,它是 Puppy Linux 的姊妹项目,是用一份叫 Woof 的定制工具创建的 Linux 发行。 新版本 Quirky 8.2 运行在 64 位的 x86 计算机上,主要提供了针对以前的 8.x 版本的增量改进。 Quirky Linux 8.2 x86_64 的代号是Xerus&…

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…

C++设计模式_01_设计模式简介(多态带来的便利;软件设计的目标:复用)

文章目录 本栏简介1. 什么是设计模式2. GOF 设计模式3. 从面向对象谈起4. 深入理解面向对象5. 软件设计固有的复杂性5.1 软件设计复杂性的根本原因5.2 如何解决复杂性 ? 6. 结构化 VS. 面向对象6.1 同一需求的分解写法6.1.1 Shape1.h6.1.2 MainForm1.cpp 6.2 同一需求的抽象的…

MusicBrainz Picard for Mac :音乐文件ID3编辑器

MusicBrainz Picard for Mac是一款macOS平台的音乐文件ID3编辑器,能够帮助我们在Mac电脑上编辑音乐文件的ID3标签信息,包括艺人、专辑等信息,非常快速和简单方便。Picard是下一代MusicBrainz标记应用程序。 这个新的标签概念是面向专辑的&…