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

一、介绍

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。
---------------------
作者:xinmeng_wit
链接:https://bbs.21ic.com/icview-3290826-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对于C/OS-II、 embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为6.0版。 作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。 FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。 FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用 时间。 FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当 FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当 FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行 效率。 FreeRTOS的移植:FreeRTOS操作系统可以被方便地移植到不同处理器上工作,现已提供了ARM、MSP430、 AVR、PIC、C8051F等多款处理器的移植。FrceRTOS在不同处理器上的移植类似于μC/0S一II,故本文不再详述FreeRTOS的移 植。此外,TCP/IP协议栈μIP已被移植到FreeRTOS上,具体代码可见FreeRTOS网站 相对于常见的μC/OS—II操作系统,FreeRTOS操作系统既有优点也存在不足。其不足之处, 一方面体现在系统的服务功能上,如FreeRTOS只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息;另一方 面,FreeRTOS只是一个操作系统内核,需外扩第三方的GUI(图形用户界面)、TCP/IP协议栈、FS(文件系统)等才能实现一个较复杂的系统, 不像μC/OS-II可以和μC/GUI、μC/FS、μC/TCP-IP等无缝结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值