SEGGER Embedded Studio IDE移植embOS

news2024/11/29 0:50:15

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。

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

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

相关文章

第1章 MySQL数据库概述

1.1 基本概念 数据库是什么&#xff1f; 存储数据的地方 DB&#xff1a;数据库&#xff08;Database&#xff09; 为什么要用数据库&#xff1f; 因为应用程序产生的数据是在内存中的&#xff0c;如果程序退出或者是断电了&#xff0c;则数据就会消失。使用数据库是为了…

【中学教资科目二】02中学课程

02中学课程 第一节 课程概述1.1 课程的分类 第二节 课程组织2.1 课程内容的文本表现形式2.2 课程评价 第三节 基础教育课程改革3.1 基础教育改革的目标3.2 新课改的课程结构 第一节 课程概述 1.1 课程的分类 学校课程有多种类型&#xff0c;其中最利于学生系统掌握人类所取得的…

收费4980的AI批量混剪,素材技术方法工具配套,详细拆解!

前几天有朋友跟我讲&#xff0c;他说有做旅游卡的&#xff0c;他们收费4980元&#xff0c;给500张卡&#xff0c;送AI批量混剪技术&#xff0c;问我们有没有&#xff1f; 批量混剪技术&#xff0c;这个其他早在2022年的时候我们就已经使用了。有开通抖音企业号的朋友都知道&am…

HarmonyOS角落里的知识—Stage模型应用程序

开发态包结构 在DevEco Studio上创建一个项目工程&#xff0c;并尝试创建多个不同类型的Module。根据实际工程中的目录对照本章节进行学习&#xff0c;可以有助于理解开发态的应用程序结构。 图1 项目工程结构示意图&#xff08;以实际为准&#xff09; 工程结构主要包含的文…

舒适佩戴,享受沉浸式音乐体验,西圣AVA2耳机体验

平时不管是听音乐&#xff0c;还是打电话&#xff0c;戴上一副耳机都可以让我们获得更好的隐私性&#xff0c;并且在公共场所&#xff0c;比如办公室、车厢里&#xff0c;也可以获得属于自己的空间。现在市面上耳机的选择非常多&#xff0c;音质、续航和佩戴的舒适度是我们选择…

2004年-2022年 全国31省市场分割指数数据

市场分割指数在经济学领域是一个关键的概念&#xff0c;特别是在评估不同区域市场一体化水平时。陆铭等学者深入研究了市场分割问题&#xff0c;并对市场分割指数给出了定义&#xff1a;它是一个衡量在相同时间点不同区域或同一区域在不同时间点的某类商品相对价格差异的指标。…

homework 2024.06.17 math, UI

A的宽度225 B的宽度150 这样画出来就比较标准&#xff0c; 225 * 2 150 * 3 2A 3B

技术驱动会展:展位导航系统的架构与实现

随着会展行业的快速发展&#xff0c;大型会展中心面临着如何提升参展者体验、提高招商效率的挑战。针对客户反馈的展馆面积大、展位查找困难等问题&#xff0c;维小帮提出一套智慧会展导航解决方案&#xff0c;旨在通过先进的室内导航技术提升会展中心的运营效率和参展者的满意…

驱动芯片退饱和保护(DESAT)

短路测试和双脉冲测试。 功率模块的短路承受能力的评估分为短路时间评估和短路能量评估两大类。短路时间由短路检测时间与短路关断时间共同构成 短路检测需要兼顾时效性与抗扰性能&#xff0c;要求系统能够及时响应&#xff0c;避免功率模块损坏。同时能够屏蔽开关过程的干扰…

JAVA每日总结day6.21

ok了家人们&#xff0c;今天我们学习了面向对象中关键字的使用和抽象类&#xff0c;话不多说&#xff0c;我们一起看看吧&#xff0c;&#xff08;今天终于星期五了&#xff0c;芜湖&#xff01;&#xff01;&#xff01;&#xff09; 一&#xff0c;this和super关键字 1&…

【C++ | 重载运算符】一文弄懂C++运算符重载,怎样声明、定义运算符,重载为友元函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-21 2…

从艳彩山水到艳彩艺术 薛永年:郭泰来艳彩艺术填补了中国美术史的空白

薛永年先生 自6月12日开展以来&#xff0c;郭泰来现代艺术大展杭州如火如荼地进行着&#xff0c;吸引了众多艺术爱好者和专业人士前往。毫不夸张地说&#xff0c;总统和清洁工人都能在他的作品中找到自己心中的那一块共振带并与之产生强烈的共鸣&#xff0c;这便是郭泰来先生的…

如何禁止学生开启windows防火墙

信息课上&#xff0c;学生最喜欢开启windows防火墙来脱离电子教室的控制&#xff0c;如何禁止学生开启Windows防火墙&#xff0c;可以从以下几个方面入手&#xff1a; 一、使用组策略编辑器 打开组策略编辑器&#xff1a;按下WinR键&#xff0c;输入gpedit.msc并回车&#xf…

眼在手上标定结果应用:像素坐标转机械臂世界坐标

像素坐标转世界坐标主要用到如下的公式&#xff1a;其中boar2camera矩阵可由通过拍摄的标定板图片直接求解&#xff0c;为相机内参矩阵 camera_matrix: rows: 3 cols: 3 data: [428.3066849046146, 0, 675.2344606795484, 0, 431.0838735333736, 405.3373367752419, 0, 0, 1] …

cron.timezone

系统 date 数据库 show timezone插件 show cron.timezonealter system set cron.timezonePRC;show cron.timezone

NSSCTF-Web题目13

目录 [SWPUCTF 2022 新生赛]js_sign 1、题目 2、知识点 3、思路 [MoeCTF 2021]Do you know HTTP 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]js_sign 1、题目 2、知识点 base64编码、敲击码&#xff08;tap code&#xff09; 3、思路 页面没有什么&#xff0c;…

fataadmin导出Exel文件图片太大

// 导出图片过大处理 exportOptions: {ignoreColumn: [0, operate],onBeforeSaveToFile: function (data, fileName, type, charset, encoding, bom) {return $.fn.bootstrapTable.defaults.extend.savestatus;},onCellHtmlHyperlink: function ($cell, rowIndex, colIndex, hr…

vue2 + Lodop 制作可视化设计页面 实现打印设计功能(一)

前言&#xff1a; 此功能的来源来自于当时需要制作一个便于客户操作的打印设计功能&#xff0c;然后就有了这个项目。这个帖子主要是用于分享与谈论&#xff0c;相互学习。 目标&#xff1a; 能在vue页面中拖拽组件支持批量操作拖动通过拖拽组件列表里的组件到page进行添加实…

四,SSM整合-前后端分离(实现分页+前后端校验)

分页与校验 实现功能07-分页显示列表需求分析/图解思路分析代码实现完成测试 实现功能08-带条件查询分页显示列表需求分析/图解思路分析代码实现 实现功能09-添加家居表单前端校验需求分析/图解思路分析代码实现 实现功能10-添加家居表单后端校验需求分析/图解思路分析代码实现…

普通变频器位置闭环控制(S7-1200PLC工艺对象模拟量轴)

1、S7-1200PLC控制V90总线伺服通过工艺对象实现定位控制 S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)_1200报文3控制v90-CSDN博客文章浏览阅读182次。V90伺服驱动器调试软件SINAMICS V-ASSISTANT Commissioning tool下载地址如下:西门子官网选型|资料CS…