发新帖本帖赏金 80.00元(功能说明)我要提问
12下一页
返回列表
打印
[N32G45x]

轻松几步将embOS移植到国民N32G45X上

[复制链接]
3495|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
本帖最后由 xinmeng_wit 于 2023-3-18 10:13 编辑

#申请原创#
一、介绍

embOS是由SEGGER公司推出的实时嵌入式操作系统(RTOS),自1992年以来,embOS一直是嵌入式市场工程师首选的实时操作系统。它提供了易用性,并保证任何嵌入式设备都能100%确定实时操作。该实时操作系统具有高度可移植性,并且在所有平台上完全兼容源代码,因此可以轻松地将应用程序移植到不同的内核。使用信号量、邮箱和事件等通信机制,可以轻松地创建任务并安全地相互通信。
embOS是商业RTOS,公司使用需要购买,但是对于个人非商业用途是完全免费的,只提供库,不提供源代码。

本文将embOS移植到国民技术的N32G45X开发板上。

二、embOS包下载

SEGGER官网提供了很多的示例程序,包括不同的IDE/编译器和不同的处理器内核的示例包,可以根据需要选择下载。
网址:https://www.segger.com/downloads/embos/

因为国民N32G45X是ARM cortex-M系列MCU,同时我这边使用的IDE是keil MDK,所以我选择下载“embOS for Cortex-M and KEIL compiler”这个包。



下载以后,解压后如下:



再进入到Start文件夹下,会有三个文件夹,说明如下:



三、开始移植

首先进入BoardSupport文件夹,里面有各个厂家的芯片的配合好的例程我们可以选择一个我们比较熟悉的一个厂家作为base进行移植。
我就选择比较熟悉的ST,然后进入ST文件夹,可以看到SEGGER为ST各种型号的mcu都有适配。
因为国民N32G45X是cortex-M4内核的,所以我这里选择STM32F429_STM32F429ZI_Nucleo这个工程作为基础进行修改。
但是,为了不影响原来的STM32F429_STM32F429ZI_Nucleo工程,将STM32F429_STM32F429ZI_Nucleo文件夹及其里面的所有内容复制一份并重命名为N32G45X。





双击打开N32G45X文件夹下的keil工程



打开之后可以看到工程中包含的相关文件,需要修改/替换的文件我都做了标注。

可以看到涉及到替换或者修改的文件只有4个,分别为BSP.c , RTOSInit_STM32F4xx.c, system_stm32f4xx.c 和startup_stm32f429_439xx.s




先进行文件替换,按照下面的步骤来:

1、除将system_stm32f4xx.c 和startup_stm32f429_439xx.s从工程中移

2、将国民N32的这两个文件复制到相应的文件夹中(N32G45X\DeviceSupport),同时对应的.h文件也要一并替换,另外,N32的n32g45x_conf.h文件也要放进去。
替换完成后如下:



3、将system_n32g45x.c和startup_n32g45x.s加入到keil工程中,加入后如下:



到这里文件替换的操作就做完了。

可以开始进行代码修改了。

1、修改启动文件,也就是startup_n32g45x.s

启动文件只需要增加4含代码,将Stack_Mem,Stack_Size和Stack_Limit变量导出,因为embOS会用到这三个变量,修改完成后如下:



2、修改RTOSInit_STM32F4xx.c文件

RTOSInit_STM32F4xx.c文件只需要修改一行,将stm32的头文件换成n32的头文件,完成后如下:



3、修改n32g45x_conf.h文件

因为我们没有向工程文件夹中添加国民技术N32的官方库文件,所有很多类似n32g45x_xx.h这种文件是找不到的,编译会报错。
这里我们直接注释掉这些头文件,修改完成后如下:




4、修改BSP.c

实际上,到这里关于embOS的移植就已经完成了,BSP.c只是为了测试embOS能否正常工作的一个测试文件,里面只涉及到对led的配置,与embOS的移植没有关系。

为了能够直接使用官方提供的测试例程,我们还是来修改一下BSP.c,让led能够适配我们的开发板。

我使用的是开发板是国民官方的开发板版N32G45XVL-STB,板载三个用户led,我们只使用其中两个,分别接在PA8和PB5。

BSP.c修改完成后如下,为了能够让大家直接拿去使用,我就直接贴代码:


/*********************************************************************
*                     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                                        *
*                                                                    *
**********************************************************************

----------------------------------------------------------------------
File    : BSP.c
Purpose : BSP for the ST STM32F429_Nucleo board
--------  END-OF-HEADER  ---------------------------------------------
*/

#include "BSP.h"

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define RCC_BASE_ADDR    (0x40021000u)
#define RCC_APB2PCLKEN   (*(volatile unsigned int*)(RCC_BASE_ADDR + 0x18u))
#define RCC_LED0PORT_BIT  (2)  //PORT A
#define RCC_LED1PORT_BIT  (3)  //PORT B

#define GPIOA_BASE_ADDR  (0x40010800u)
#define GPIOA_PL_CFG     (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x00u))
#define GPIOA_PH_CFG     (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x04u))
#define GPIOA_PBSC       (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x10u))
#define GPIOA_POD        (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x0Cu))
        
#define GPIOB_BASE_ADDR  (0x40010C00u)
#define GPIOB_PL_CFG     (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x00u))
#define GPIOB_PH_CFG     (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x04u))
#define GPIOB_PBSC       (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x10u))
#define GPIOB_POD        (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x0Cu))

#define LED0_BIT         ( 8)  // LED0 (green) - PA8
#define LED1_BIT         ( 5)  // LED2 (blue)  - PB5

/*********************************************************************
*
*       Global functions
*
**********************************************************************
*/

/*********************************************************************
*
*       BSP_Init()
*/
void BSP_Init(void) {
  //
  // Initialize port for LEDs (sample application)
  //
  RCC_APB2PCLKEN  |=  (1u << RCC_LED0PORT_BIT);

        if(LED0_BIT > 7)
        {
                GPIOA_PH_CFG &= ~(15u << (LED0_BIT  - 8) * 4); // Reset mode; sets port to input
                GPIOA_PH_CFG |=  (3u << (LED0_BIT  - 8) * 4);  // Set to output mode
                GPIOA_PBSC   |=  (1u << (LED0_BIT + 15));      // Initially clear LED, LED OFF
        }

        
  RCC_APB2PCLKEN  |=  (1u << RCC_LED1PORT_BIT);

        if(LED1_BIT > 7)
        {
                GPIOB_PH_CFG &= ~(15u << (LED1_BIT  - 8) * 4);  // Reset mode; sets port to input
                GPIOB_PH_CFG |=  (3u  << (LED1_BIT  - 8) * 4);  // Set to output mode
                GPIOB_PBSC   |=  (1u  << (LED1_BIT + 15));      // Initially clear LED, LED OFF
        }
        else
        {
                GPIOB_PL_CFG &= ~(15u << LED1_BIT * 4);         // Reset mode; sets port to input
                GPIOB_PL_CFG |=  (3u  << LED1_BIT * 4);         // Set to output mode
                GPIOB_PBSC   |=  (1u  << (LED1_BIT + 15));      // Initially clear LED, LED OFF
        }
}

/*********************************************************************
*
*       BSP_SetLED()
*/
void BSP_SetLED(int Index) {
  if (Index == 0) {
    GPIOA_PBSC   |=  (1u << LED0_BIT);     // Switch on LED0
  } else if (Index == 1) {
    GPIOB_PBSC   |=  (1u << LED1_BIT);         // Switch on LED1
  } else if (Index == 2) {
    //GPIOB_ODR |= (1u << LED2_BIT);         // Switch on LED2
  }
}

/*********************************************************************
*
*       BSP_ClrLED()
*/
void BSP_ClrLED(int Index) {
  if (Index == 0) {
    GPIOA_PBSC   |=  (1u << (LED0_BIT + 15));        // Switch off LED0
  } else if (Index == 1) {
    GPIOB_PBSC   |=  (1u << (LED1_BIT + 15));        // Switch off LED1
  } else if (Index == 2) {
    //GPIOB_ODR &= ~(1u << LED2_BIT);        // Switch off LED2
  }
}

/*********************************************************************
*
*       BSP_ToggleLED()
*/
void BSP_ToggleLED(int Index) {
  if (Index == 0) {
    GPIOA_POD ^= (1u << LED0_BIT);         // Toggle LED0
  } else if (Index == 1) {
    GPIOB_POD ^= (1u << LED1_BIT);         // Toggle LED1
  } else if (Index == 2) {
    //GPIOB_ODR ^= (1u << LED2_BIT);       // Toggle LED2
  }
}

/****** End Of File *************************************************/

到这里代码虽然修改完了,但是还需要配置一下工程,因为现在keil里面的芯片选的还是STM32f29,需要进行更改,主要有如下几个地方:










最后一步,编译并下载到开发板:

出现了我们最愿意看到的结果:



此时,下载到开发板,然后重新reset一下开发板,就能看到两个LED灯开发闪烁,红灯50ms翻转一次,绿灯200ms翻转一次,对比非常明显。

在OS_StartLEDBlink.c里面有两个TASK,分别为:

static void HPTask(void) {
  while (1) {
    BSP_ToggleLED(0);
    OS_TASK_Delay(50);
  }
}

static void LPTask(void) {
  while (1) {
    BSP_ToggleLED(1);
    OS_TASK_Delay(200);
  }
}

如果不放心,可以修改一下led的闪烁频率,看看是否真的移植成功了。

可以确定,真的移植成功了,非常完美的让国民技术N32  mcu用上了商业RTOS --embOS。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 80.00 元 2023-03-20
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
蔬菜MOS 2023-3-30 14:05 回复TA
通俗易懂,步骤完整,思路清晰。 
21小跑堂 2023-3-20 15:11 回复TA
由于embOS的特殊性,显得较为小众,但是这不是妨碍技术研究的理由,作者很详细的描述了整个移植过程,排版舒适,配图清晰,仅观版面便让读者感到舒适,很棒哦! 
cooldog123pp 2023-3-20 08:45 回复TA
很好的应用文章 
29
chenqianqian| | 2023-5-2 10:19 | 只看该作者
embos是嵌入式工程师的首选操作系统?不是吧。

使用特权

评论回复
28
shizaigaole| | 2023-4-30 21:00 | 只看该作者
其实RTOS最重要的应该是系统资源占用,系统资源占用低的,可以应用的MCU型号多。
这方面embos和RTX比较优秀

使用特权

评论回复
27
shizaigaole| | 2023-4-30 20:12 | 只看该作者
凡是可以用keil的M3,M4,M芯片,都可以直接用CMSIS-os,或者RTX,freertos,不需要移植,
是最方便的RTOS使用方式

使用特权

评论回复
26
shizaigaole| | 2023-4-30 20:10 | 只看该作者
华为的LiteOS 也给出了CMSIS-oS接口了

使用特权

评论回复
25
shizaigaole| | 2023-4-30 20:04 | 只看该作者
本帖最后由 shizaigaole 于 2023-4-30 20:13 编辑

目前大多数RTOS都不需要移植。

市场上,freertos是支持最广的,几乎任何MCU都有直接的例程,UCOS例程也比较多,源码开放,玩的人比较多,国内那帮RTTHREAD之类基本上都是抄袭参考UCOS。
RTX其实是非常好的RTOS,keil直接集成,只要支持KEIL的芯片,就可以直接拿来用,不用移植。
embos还不错,目前来说,也可以不移植,在keil中直接使用,只不过要套一层CMSISC-OS接口。

推荐直接使用,CMSIS-OS接口,使用者直接使用CMSIS-OS相关的API,底层操作可以是各种RTOS,如freertos,rtx,embos等。
除此外,推荐使用freertos,各个芯片厂家支持最好

使用特权

评论回复
24
adolphcocker| | 2023-4-8 14:01 | 只看该作者
之前移植freeRTOS到N32G45X

使用特权

评论回复
23
minzisc| | 2023-4-8 13:54 | 只看该作者
embOS是高度模块化的,只有需要的函数才被调用,占用的ROM非常小。

使用特权

评论回复
22
10299823| | 2023-4-8 13:44 | 只看该作者
embOS是SEGGER公司开发的一款RTOS,支持抢占调度和时间片轮询调度。

使用特权

评论回复
21
updownq| | 2023-4-8 13:37 | 只看该作者
移植embOS,不需要修改汇编程序的吗?

使用特权

评论回复
20
jonas222| | 2023-4-7 23:49 | 只看该作者
N32G45X都支持什么操作系统?

使用特权

评论回复
19
rosemoore| | 2023-4-7 23:13 | 只看该作者
embOS灵活定制系统,可以满足实际需求

使用特权

评论回复
18
claretttt| | 2023-4-7 22:47 | 只看该作者
embOS实时操作系统 看着不错。

使用特权

评论回复
17
cemaj| | 2023-4-7 10:23 | 只看该作者
FLASH和RAM的需求对比怎么样

使用特权

评论回复
16
lihuami| | 2023-4-7 10:05 | 只看该作者
常见嵌入式系统有哪些               

使用特权

评论回复
15
bestwell| | 2023-4-7 09:52 | 只看该作者
是不是可以使用keil 的pack自带的os系统呢?

使用特权

评论回复
14
beacherblack| | 2023-4-7 09:40 | 只看该作者
embOS内存占用少,ROM最少只占用1.7KB。  

使用特权

评论回复
13
七毛钱| | 2023-4-6 14:57 | 只看该作者
这个系统有点小众化吧

使用特权

评论回复
12
deliahouse887| | 2023-4-4 22:18 | 只看该作者
现在使用RT-thread的系统非常多。

使用特权

评论回复
11
everyrobin| | 2023-4-4 21:59 | 只看该作者
这个占用的内存很大的吗?              

使用特权

评论回复
10
robincotton| | 2023-4-4 21:34 | 只看该作者
embOS是一个优先级控制的多任务系统,是专门为各种微控制器应用于实时系统应用的嵌入式操作系统.是一个具有最小RAM和ROM占用的、高速的、多功能的高性能工具。

使用特权

评论回复
发新帖 本帖赏金 80.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

264

帖子

1

粉丝