SEGGER Embedded Studio IDE移植embOS

SEGGER Embedded Studio IDE移植embOS

  • 一、背景介绍
  • 二、任务目标
  • 三、技术实现
    • 3.1 获得embOS
    • 3.2 创建SES工程
      • 3.2.1 创建初始Solution和Project
      • 3.2.2 制作项目文件结构
      • 3.2.3 移植embOS库和有关头文件
        • 3.2.3.1 头文件
        • 3.2.3.2 库文件
        • 3.2.3.3 创建RTOSInit.c源文件
        • 3.2.3.4 OS_Error.c文件
      • 3.2.4 测试用例
    • 3.3 测试
  • 四、结论

一、背景介绍

一直以来我们项目和学习用到的最多的RTOS主要是FreeRTOS、RTT、Keil RTX。但是在SEGGER Embedded Studio(SES)上,我们还可以使用SEGGER出品的embOS系统。和FreeRTOS源码类似,我们也得做一些的移植工作。

这里郑重声明:本贴仅用于学习和非商业化应用。如果您要将embOS用于商业化项目中,还需要采购。

SEGGER的很多工具有个最大的好处就是,对于学习和爱好者是比较友好的。我们可以直接下载二进制库,根据手册稍微做一点适配就可以应用了。由于笔者目前对SEGGER的这些工具还没有那么熟悉,本次就仅仅是移植embOS,就不联合其他的工具了。

这里有关的移植的办法都是参考的手册。同时,embOS包里也有一些成型的项目可以测试。

主要参考文件都是来自embOS包的文件,有:

  1. UM01001_embOS.pdf
  2. UM01061_embOS_CortexM_ES.pdf
  3. /embOS_CortexM_ES_Obj_SFL_V5.18.0.0/Start/BoardSupport中有关的板级支持包源代码

二、任务目标

在“墨子号”开发板上运行程序。这个“墨子号”是个在马云家上买的一个小开发板,有2个485,1个CAN和若干其他的资源。图片如下所示。

Alt

调试器还是SEGGER J-link Compact。

这次的任务目标是

  1. 配置embOS的配置头文件
  2. 编译通过带embOS的代码
  3. 运行一个任务
  4. 运行一个定时器

三、技术实现

3.1 获得embOS

去SEGGER embOS的官方网址下载。打开这个网址以后会发现货比较多,我这里用的是“
embOS for Cortex-M and SEGGER Embedded Studio”

在这里插入图片描述
注意:虽然我们后面在编译器上可能还是用GCC,但是这里不是上面的那个GCC的。那个GCC版本的好像是不用IDE,你自己用CMAKE那样的工具做个项目再用GCC编译的时候会用到。

下载后,解压,我们会得到一个文件夹叫“embOS_CortexM_ES_Obj_SFL_V5.18.0.0”,里面的内容如下:

在这里插入图片描述

3.2 创建SES工程

3.2.1 创建初始Solution和Project

打开SES,创建一个工程叫做embOS_Portion。创建的时候有关的IDE配置做如下的初始配置。

在这里插入图片描述
编译器默认的是SEGGER,但是我这里改成了GCC。printf函数打开“Printf Width/Precision Supported”。本程序不用堆,主栈给个512字节够启动就可以了。

跟往常一样,系统生成了一个Solution,一个Project和一个main.c。不过这次IDE升级以后,凡是在C文件中的没有被用到的但是被包含了两头文件,都给你打个波浪线。就像这样的:

在这里插入图片描述

3.2.2 制作项目文件结构

在SES中的Source Files下面创建文件夹和子文件夹,最终形成项目的文件结构。在物理上去项目文件夹内创建Source Files文件夹,在里面再创建Application,BSP,embOS这三个子文件夹。
在这里插入图片描述

3.2.3 移植embOS库和有关头文件

3.2.3.1 头文件

参考随包配送的两个pdf,分别是UM01001_embOS.pdf和UM01061_embOS_CortexM_ES.pdf。需要在工程文件夹的embOS文件夹下出现RTOS.h和OS_Config.h两个文件。那就去/embOS_CortexM_ES_Obj_SFL_V5.18.0.0/Start/Inc下面的这两个文件移动到工程文件夹的embOS/下面。

参考OS_Config.h里面的内容,我们想链接哪个库,就要定义相关的宏。

/*********************************************************************
*
*       Configuration for RTOS build and embOSView communication
*
*  In your application program, you need to let the compiler know
*  which build of embOS you are using. This is done by adding the
*  corresponding define to your preprocessor settings and linking the
*  appropriate library file.
*
*  OS_LIBMODE_XR    Extremely small release build without Round robin
*  OS_LIBMODE_R     Release build
*  OS_LIBMODE_S     Release build with stack check
*  OS_LIBMODE_SP    Release build with stack check and profiling
*  OS_LIBMODE_D     Debug build
*  OS_LIBMODE_DP    Debug build with profiling
*  OS_LIBMODE_DT    Debug build with trace
*
*  If no preprocessor setting is used, this file will select default
*  modes for debug and release configurations of your project.
*/

在这个里面定义的控制宏如下所示。

#if (defined(DEBUG) && (DEBUG == 1))#define OS_LIBMODE_DP
#else#define OS_LIBMODE_R#define OS_VIEW_IFSELECT  OS_VIEW_DISABLED  // embOSView communication is disabled per default in release configuration
#endif

但是我这里只是为了任务目标,就不采用DP了。我们的头文件是

/*********************************************************************
*                     SEGGER Microcontroller GmbH                    *
*                        The Embedded Experts                        *
**********************************************************************
*                                                                    *
*       (c) 1995 - 2022 SEGGER Microcontroller GmbH                  *
*                                                                    *
*       Internet: segger.com  Support: support_embos@segger.com      *
*                                                                    *
**********************************************************************
*                                                                    *
*       embOS * Real time operating system                           *
*                                                                    *
*       Please note:                                                 *
*                                                                    *
*       Knowledge of this file may under no circumstances            *
*       be used to write a similar product or a real-time            *
*       operating system for in-house use.                           *
*                                                                    *
*       Thank you for your fairness !                                *
*                                                                    *
**********************************************************************
*                                                                    *
*       OS version: V5.18.0.0                                        *
*                                                                    *
**********************************************************************-------------------------- END-OF-HEADER -----------------------------
File    : OS_Config.h
Purpose : Configuration settings for the OS build and embOSView
*/#ifndef OS_CONFIG_H
#define OS_CONFIG_H/*********************************************************************
*
*       Configuration for RTOS build and embOSView communication
*
*  In your application program, you need to let the compiler know
*  which build of embOS you are using. This is done by adding the
*  corresponding define to your preprocessor settings and linking the
*  appropriate library file.
*
*  OS_LIBMODE_XR    Extremely small release build without Round robin
*  OS_LIBMODE_R     Release build
*  OS_LIBMODE_S     Release build with stack check
*  OS_LIBMODE_SP    Release build with stack check and profiling
*  OS_LIBMODE_D     Debug build
*  OS_LIBMODE_DP    Debug build with profiling
*  OS_LIBMODE_DT    Debug build with trace
*
*  If no preprocessor setting is used, this file will select default
*  modes for debug and release configurations of your project.
*/#if (defined(DEBUG) && (DEBUG == 1))#define OS_LIBMODE_D
#else#define OS_LIBMODE_R#define OS_VIEW_IFSELECT  OS_VIEW_DISABLED  // embOSView communication is disabled per default in release configuration
#endif/*********************************************************************
*
*  Additional embOS compile time configuration defines when using
*  embOS sources in your project or rebuilding the embOS libraries
*  can be added here, e.g.:
*    #define OS_SUPPORT_TICKLESS  0  // Disable tickless support
*/#endif  // OS_CONFIG_H/*************************** End of file ****************************/
3.2.3.2 库文件

打开/embOS_CortexM_ES_Obj_SFL_V5.18.0.0/Start/Lib,会发现里面有很多的库文件。

在这里插入图片描述
我们就只需要把libos_v7m_t_vfpv4_le_d.a和libos_v7m_t_vfpv4_le_r.a两个库复制到项目文件夹下面的/Source Files/embOS/Library下面。

至于为什么是这两个库呢?这是因为,根据芯片的内核手册,ST的ARM核是ARMv7M,cortex-m4的内核里面有个FPUv4f的乘法器。ARM-CM是小端。所以我们选这两个库文件。

3.2.3.3 创建RTOSInit.c源文件

参考《UM01001_embOS.pdf》的第26章的内容和有关的例程源码文件,必须要创建RTOSInit.c文件并在里面实现有关的接口函数。下面这几个接口是必须要实现的。
在这里插入图片描述

下面这几个是可选的,但是要注意的是,那个SysTick_Handler,貌似是必须要实现的。因为通过调试我们发现,似乎系统并没有给实现一个默认的函数。如果自己不实现一个,一旦异常发生,会卡住在异常向量表。
在这里插入图片描述

这样,我们实现的RTOSInit.c源文件的源代码如下所示。

#include "RTOS.h"
#include "stm32f4xx.h"#define OS_TIMER_FREQ (168000000u) // Peripheral clock for timer
#define OS_TICK_FREQ (1000u) // System tick frequency
#define OS_INT_FREQ (OS_TICK_FREQ) // Timer interrupt frequency#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK)const OS_U32 OS_JLINKMEM_BufferSize = 32u;  // Size of the communication buffer for JLINKMEM
#elseconst OS_U32 OS_JLINKMEM_BufferSize = 0u;   // Buffer not used
#endifstatic unsigned int _OS_GetHWTimerCycles(void) {return SysTick->VAL;
}
static unsigned int _OS_GetHWTimer_IntPending(void) {return SCB->ICSR & SCB_ICSR_PENDSTSET_Msk;
}
void SysTick_Handler(void) {OS_INT_EnterNestable();OS_TICK_Handle();OS_INT_LeaveNestable();
}void OS_InitHW(void) {SystemCoreClockUpdate();SysTick_Config(SystemCoreClock / OS_INT_FREQ);NVIC_SetPriority(SysTick_IRQn, (1u << __NVIC_PRIO_BITS) - 2u);OS_SYSTIMER_CONFIG SysTimerConfig = {SystemCoreClock / OS_TICK_FREQ,OS_INT_FREQ,OS_TIMER_DOWNCOUNTING,_OS_GetHWTimerCycles,_OS_GetHWTimer_IntPending};OS_INT_IncDI();
//
// Initialize timer for embOS
//
//
// Setup timing information
//OS_TIME_ConfigSysTimer(&SysTimerConfig);
//
// Initialize communication for embOSView
//OS_INT_DecRI();
}void OS_Idle(void) { // Idle loop: No task is ready to executewhile (1) { // Nothing to do ... wait for interrupt}
}void OS_COM_Send1(OS_U8 c) {
}

这个文件里就是要实现6个函数。其中最主要的工作量是实现void OS_InitHW(void)函数。这个函数

  1. 在这个函数里面要初始化SysTick异常处理
  2. 构造用于设置RTOS时钟的OS_SYSTIMER_CONFIG结构体。
  3. 调用OS_TIME_ConfigSysTimer(OS_SYSTIMER_CONFIG*)函数设置RTOS的系统时钟。
  4. OS_INT_IncDI()OS_INT_DecRI()这两个函数目前还不清楚功能。只是模板上的东西,就放在上面就好

其次要注意的函数有void SysTick_Handler(void)。我这里直接采用了模板的代码。

3.2.3.4 OS_Error.c文件

这个文件用于编译Debug目标用的。直接去板级移植包里搞一个就可以了

3.2.4 测试用例

参考了一下手册,我用主函数直接做了测试


#include "RTOS.h"static OS_STACKPTR int StackHP[128], StackLP[128]; // Task stacks
static OS_TASK TCBHP, TCBLP; // Task control blocks
static OS_TIMER Timer0, Timer1;
static void Callback0(void) {OS_TIMER_Restart(&Timer0);
}
static void Callback1(void) {OS_TIMER_Restart(&Timer1);
}
static void HPTask(void) {while (1) {OS_TASK_Delay(50);}
}
static void LPTask(void) {while (1) {OS_TASK_Delay(200);}
}int main(void) {OS_Init();OS_InitHW();OS_TASK_Create(&TCBHP, "HP Task", 100, HPTask, StackHP, sizeof(StackHP), 2);OS_TASK_Create(&TCBLP, "LP Task", 100, LPTask, StackLP, sizeof(StackLP), 2);OS_TIMER_CREATE(&Timer0, Callback0, 50u);OS_TIMER_CREATE(&Timer1, Callback1, 200u);OS_Start();return 0;
}/*************************** End of file ****************************/

检查一下是否有error出现。我这几次编译都没有出现任何问题。

3.3 测试

编译、链接、运行。
在进程和软定时器回调函数里面下断,会发现可以正常进入。
在这里插入图片描述

四、结论

经过上述的步骤,可以成功在SEGGER Embedded Studio上使用embOS。

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

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

相关文章

Golang——channel

channel是Go在语言层面提供的协程间的通信方式。通过channel我们可以实现多个协程之间的通信&#xff0c;并对协程进行并发控制。 使用注意&#xff1a; 管道没有缓冲区时&#xff0c;从管道中读取数据会阻塞&#xff0c;直到有协程向管道中写入数据。类似地&#xff0c;向管道…

生产实习Day9 ---- Scala介绍

文章目录 Scala&#xff1a;融合面向对象与函数式编程的强大语言引言Scala与Java的互操作性Scala在大数据处理中的应用Scala的并发编程Scala的学习资源和社区结论 Scala&#xff1a;融合面向对象与函数式编程的强大语言 引言 Scala&#xff0c;全称Scalable Language&#xff…

创新案例|星巴克中国市场创新之路: 2025目标9000家店的挑战与策略

星巴克创始人霍华德舒尔茨&#xff1a;“为迎接中国市场的全面消费复苏&#xff0c;星巴克2025年推进9000家门店计划&#xff0c;将外卖、电商以及家享和外出场景咖啡业务纳入中国新一轮增长计划中。”在面临中国市场同店增长大幅下滑29%背景下&#xff0c;星巴克通过DTC用户体…

【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案 【格式】PDF版本 【关键词】麦肯锡、物流、价格战略、定价体系 【核心观点】 - 与竞争对…

【mysql 安装启动失败】 没有网下 libssl.so.10 not found 如何解决?

问题描述&#xff1a; libssl.so.10 > not found libcrypto.so.10 > not found [rootmysql tools]# ls -l /usr/sbin/mysqld -rwxr-xr-x. 1 root root 64290024 Sep 14 2022 /usr/sbin/mysqld [rootmysql tools]# ldd /usr/sbin/mysqldlinux-vdso.so.1 (0x00007fff97105…

拒绝零散碎片, 一文理清MySQL的各种锁

系列文章目录 学习MySQL先有全局观&#xff0c;细说其发展历程及特点 Mysql常用操作&#xff0c;谈谈排序与分页 拒绝零散碎片&#xff0c; 一文理清MySQL的各种锁&#xff08;收藏向&#xff09; 系列文章目录一、MySQL的锁指什么二、排他与共享三、全局锁&#xff08;Global…

【C++】数据类型、函数、头文件、断点调试、输入输出、条件与分支、VS项目设置

四、基本概念 这部分和C语言重复的部分就简写速过&#xff0c;因为我之前写过一个C语言的系列&#xff0c;非常详细。C和C这些都是一样的&#xff0c;所以这里不再一遍遍重复码字了。感兴趣的同学可以翻看我之前的C语言系列文章。 1、数据类型 编程的本质就是操作数据。 操…

从零入手人工智能(4)—— 逻辑回归

1.小故事 一家金融科技公司&#xff0c;公司的首席执行官找到团队提出了一个紧迫的问题&#xff1a;“我们如何提前知道哪些客户可能会违约贷款&#xff1f;” 这让团队陷入了沉思&#xff0c;经过激烈讨论团队中的数据分析师提议&#xff1a;“我们可以尝试使用逻辑回归来预测…

基于51单片机的函数信号发生器

基于51单片机函数信号发生器 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.LCD1602液晶显示波形种类和频率值&#xff08;10-100HZ&#xff09;&#xff1b; 2.按键设置波形种类和设定频率步进值…

UE5近战对抗系统Tutorial

文章目录 BP_Character 组合攻击Notify State 检测攻击BP_Character 攻击反馈BP_Character 生命系统BP_Character 死亡效果BP_Character 武器系统BP_Enemy 初始化和行为树 BP_Character 组合攻击 首先我们获取攻击动画&#xff0c;在这里使用的是 Easy Combo Buffering 的攻击…

聊聊JSON

引言 JSON的概念 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它基于JavaScript的一个子集&#xff0c;但独立于语言&#xff0c;这意味着它可以被许多编程语言轻松解析。JSON的简洁性和易读性使其成为Web开发中数据交换的…

掌握 NumPy:高效数组处理综合指南(第 2/2 部分)

照片由 兹比内克布里瓦尔 on Unsplash 一、介绍 欢迎来到我关于 NumPy 的教程的第二部分&#xff01;之前&#xff0c;我们已经介绍了以下列表中的前 7 章。现在在这篇文章中&#xff0c;我们将从第 8 章一直到第 14 章。 Numpy 安装数组初始化Numpy 数组限制计算速度和内存使用…

量子计算:1 从薛定谔的猫开始

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

基于PHP的民宿管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的民宿管理系统 一 介绍 此民宿管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery.js和echarts.js。系统角色分为用户和管理员。用户可以在线浏览和预订民宿&#xff0c;管理员登录后台进行相关管理等。(在系统…

【python】OpenCV——Color Correction

文章目录 cv2.aruco 介绍imutils.perspective.four_point_transform 介绍skimage.exposure.match_histograms 介绍牛刀小试遇到的问题 参考学习来自 OpenCV基础&#xff08;18&#xff09;使用 OpenCV 和 Python 进行自动色彩校正 cv2.aruco 介绍 一、cv2.aruco模块概述 cv2.…

JAVA小知识28:FIle类文件对象

Java 中的 File 类是 java.io 包中的一个类&#xff0c;用于表示文件和目录路径名的抽象表示。它提供了一些方法来操作文件和目录 一、File的创建 1.1、绝对路径 绝对路径是指从文件系统的根目录开始定位文件或目录的完整路径。它通常以根目录符号开始&#xff0c;在 Window…

【Mac】DMG Canvas for mac(DMG镜像制作工具)软件介绍

软件介绍 DMG Canvas 是一款专门用于创建 macOS 磁盘映像文件&#xff08;DMG&#xff09;的软件。它的主要功能是让用户可以轻松地设计、定制和生成 macOS 上的安装器和磁盘映像文件&#xff0c;以下是它的一些主要特点和功能。 主要特点和功能 1. 用户界面设计 DMG Canva…

Rocky Linux 更换CN镜像地址

官方镜像列表&#xff0c;下拉查找 官方镜像列表&#xff1a;https://mirrors.rockylinux.org/mirrormanager/mirrorsCN 开头的站点。 一键更改镜像地址脚本 以下是更改从默认更改到阿里云地址 cat <<EOF>>/RackyLinux_Update_repo.sh #!/bin/bash # -*- codin…

自研地面站!自主开源无人飞行系统 Prometheus V2 版重大升级详解

自主开源无人飞行系统 Prometheus V2 相对于 Prometheus V1 在多方面做了重大的升级&#xff0c;今天我们将聊聊 Prometheus V2 的地面站升级。 地面站的重大提升 熟悉 Prometheus 的小伙伴们可能知道&#xff0c;V1 版本是没有专门的地面站的。而在 Prometheus V2 中&#x…

VERYCLOUD睿鸿股份亮相亚马逊云科技中国峰会2024

5月30日&#xff0c;为期两天的亚马逊云科技中国峰会在上海世博中心圆满落幕。 多位大咖现场分享&#xff0c;生成式AI时代的数据战略&#xff0c;企业级AI应用&#xff0c;最新技术、产品重磅发布&#xff0c;创新行业解决方案 …… 作为亚马逊云科技的生态合作伙伴&#x…