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
#else
  const OS_U32 OS_JLINKMEM_BufferSize = 0u;   // Buffer not used
#endif

static 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 execute
  while (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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙HarmonyOS NEXT角落里的知识:ArkTS高性能编程实践

概述 本文主要提供应用性能敏感场景下的高性能编程的相关建议&#xff0c;助力开发者开发出高性能的应用。高性能编程实践&#xff0c;是在开发过程中逐步总结出来的一些高性能的写法和建议&#xff0c;在业务功能实现过程中&#xff0c;我们要同步思考并理解高性能写法的原理…

信息学奥赛初赛天天练-31-CSP-J2022基础题-指针、数组、链表、进制转换、深度优先搜索、广度优先搜索、双栈实现队列应用

PDF文档公众号回复关键字:20240621 2022 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 3.运行以下代码片段的行为是 ( ) int x 101; int y 201; int * p &x; int * q &y;…

【Java】已解决java.net.ProtocolException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.ProtocolException异常 在Java的网络编程中&#xff0c;java.net.ProtocolException异常通常表示在网络通信过程中&#xff0c;客户端或服务器违反了某种协议规则。…

ASP.NET Core 6.0 启动方式

启动方式 Visualstudio 2022启动 IIS Express IIS Express 是一个专为开发人员优化的轻型独立版本的 IIS。 借助 IIS Express,可以轻松地使用最新版本的 IIS 开发和测试网站。 控制台版面 直接在浏览器输入监听的地址,监听的是 http://localhost:5137 脚本启动 dotnet run…

Java中将文件转换为Base64编码的字节码

在Java中&#xff0c;将文件转换为Base64编码的字节码通常涉及以下步骤&#xff1a; 读取文件内容到字节数组。使用java.util.Base64类对字节数组进行编码。 下面是一个简单的Java示例代码&#xff0c;演示如何实现这个过程&#xff1a; import java.io.File; import java.io…

添加右键菜单(以git为例)

1、打开注册表编辑器 打开系统注册表&#xff0c;使用组合键“Win R”输入“regedit”。 依次展开”HKEY_CLASSES_ROOT\Directory\Background\shell”。 2、新建右键菜单项 在[Background]下找到“shell”如果没有则新建项shell&#xff0c;接着在“shell”下右键-新建项名…

Linux 线程的同步与互斥

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 前言 1.资源共享问题 2.进程线程间的互斥…

谁拥有数字营销平台即拥有企业竞争力!

掌握数字营销平台&#xff0c;就等于掌握企业竞争力&#xff01; 宝子们&#xff0c;咱今天来聊聊这个事儿哈。在现在这个数字化的时代&#xff0c;拥有像蚓链这样的数字营销平台那可太重要啦&#xff01; 想想看&#xff0c;有了它&#xff0c;企业就能更广、更快地去推广…

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

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

Word中删除空白页

① 文字后面出现的空白页 把鼠标放在空白页的位置&#xff0c;按住Ctrl Delete即可。 ② 表格后面的空白页 把鼠标放在空白页左侧&#xff0c;直到出现一个空白的箭头&#xff0c;点击一下选中空白页&#xff0c;然后再Ctrl D&#xff0c;打开字体选项卡&#xff0c;在效果中…

舔狗日记Puls微信小程序源码

源码介绍&#xff1a; 这是一款舔狗日记Puls微信小程序源码&#xff0c;提供每日一舔的功能&#xff0c;让你舔到最后&#xff0c;什么都有&#xff01; 源码通过API获取一些舔狗日记&#xff0c;内置了100多句舔狗日记&#xff0c;让你摆脱上班摸鱼的无聊时光&#xff0c; …

[240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞

目录 Anthropic 发布 Claude 3.5 Sonnet AI 助手Scoket.IO 拒绝服务漏洞&#xff08;CVE-2024-38355&#xff09; Anthropic 发布 Claude 3.5 Sonnet AI 助手 Claude 3.5 Sonnet: 更智能、更快速、更安全的 AI 助手 一、 引言 Anthropic 发布了 Claude 3.5 Sonnet&#xff0…

C语言中操作符详解(一)

众所周知&#xff0c;在我们的C语言中有着各式各样的操作符&#xff0c;并且在此之前呢&#xff0c;我们已经认识并运用了许许多多的操作符&#xff0c;都是诸君的老朋友了昂 操作符作为我们使用C语言的一个非常非常非常重要的工具&#xff0c;诸君一定要加以重视&#xff0c;…

DevOps学习回顾01-技能发展路线-岗位能力-体系认知

事为先&#xff0c;人为重–事在人为 参考来源&#xff1a; 极客时间专栏&#xff1a;DevOps实战笔记&#xff0c;作者&#xff1a;石雪峰 课程链接&#xff1a;https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性&#xff08;Volatility&…

【Android面试八股文】你能说一说自定义View与ViewGroup的区别

文章目录 Android UI 组件:View 和 ViewGroupViewGroup 的职责View 的职责自定义 View 和 ViewGroup 的区别1. 继承的类不同2. 主要功能不同3. 重写方法不同4. 使用场景不同5. 事件分发方面的区别6. UI 绘制方面的区别Android UI 组件:View 和 ViewGroup 在 Android 开发中,…

AI通用大模型不及垂直大模型?各有各的好

​​​​​​​AI时代&#xff0c;通用大模型和垂直大模型&#xff0c;两者孰优孰劣&#xff0c;一直众说纷纭。 通用大模型&#xff0c;聚焦基础层&#xff0c;如ChatGPT、百度文心一言&#xff0c;科大讯飞星火大模型等&#xff0c;都归属通用大模型&#xff0c;它们可以解答…

使用ASP.NET Core封装接口请求参数格式

有些人获取接口请求参数是直接使用数据库实体类来获取的&#xff0c;这种方式虽然写起来很方便&#xff0c;但是会导致swagger接口文档出现很多没用的参数&#xff0c;让人看着不舒服。 比如&#xff0c;新增用户只需要传用户名、密码、邮箱就可以了&#xff0c;但是实体类也包…

@ModelAttribute

基础知识 1.ModelAttribute注解源码&#xff0c;从中可以知道&#xff0c;该注解可以标注在参数上和方法上 2.应用场景&#xff1a;先大致有个概念&#xff0c;可以用来存储项目根路径 3.介绍&#xff1a;ModelAttribute 是 Spring 框架中的一个注解&#xff0c;用于在 Spring …

Go微服务: redis分布式锁在集群中可能遇到的问题及其解决方案

概述 我们的 redis 一般都是集群来给我们程序提供服务的&#xff0c;单体的redis现在也不多见 看到上面是主节点redis和下面是6个重节点redis&#xff0c;主节点和重节点的通讯都是畅通没问题的这个时候&#xff0c;我们有 gorouting 写我们的数据&#xff0c;那它就会用到我们…

labelme 标注岩石薄片数据集流程

labelme 数据标注使用流程 1.打开anaconda环境2.打开labelme工具3.打开数据集文件夹4.开始标注5. 标注完成6. 修改labels.txt文件7. 将标注结果可视化8. 完成json转图片9. 全部命令总结 1.打开anaconda环境 2.打开labelme工具 输入下列两条命令&#xff0c;打开labelme工具 &a…