针对RTX5操作系统的讲解我这边就不再赘述,下面直接进入干货;针对RTX5在GD32F407上面的一致操作;本次的移植直接在Keil的Manage Run-Time Environment环境中进行,加载RTX5的源码文件,硬件平台基于GD官方的开发板GD32407V_START;话不多少,我们直接开始操作。
准备工作:
GDMCU官网下载GD32F4xx AddOn安装包和GD32F4xx Demo Suites的开发板资料包;
官网链接:https://gd32mcu.com/cn/download
点击左侧的GD32F4 MCU,进入F4系列的文档说明;
寻找应用软件标签,其中有GD32F4xx AddOn;
下载好之后进行加压缩,针对Keil 版本有两个支持包;默认开发环境已经是Keil 5,双击进行安装,针对安装路径保持默认即可;
然后,再寻找开发板资料资料标签,下载GD32F4xx Demo Suites;
至此前期的准备工作已经完成。
打开Keil 5,并新建项目,选择我们本次使用的MCU具体型号;如下图所示:
单击OK,将会弹出本项目中的重点对话框Manage Run-Time Environment;如下所示(因每个人安装的工具不一样,如下的内容会有所区别):
按照如下所示,把需要的文件选择上(注意:Keil RTX5 后面打钩后默认是库文件,我们更改为源文件);
①:这部分是标准库文件,把所有的库文件全部选择上;
②:如果此处有提示警告或错误,或者在sel.列有棕色的提示框,点击③所示的按键,系统将会自动把警告或错误进行排除;
④:点击OK按钮,讲退回到Keil的主界面;我们添加的所有文件显示如下:
至此,我们的操作系统添加工作就完成了;就是如此的简单。
为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;
因为我这边是基于GD的官方开发板GD32407V_START,解压缩刚刚下载好的GD32F4xx_Demo_Suites_V2.6.4,如下图所示:
打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;
在项目文件下创建BSP文件夹,然后再创建LED文件夹,并把刚刚复制过来的gd32f407v_start.c和gd32f407v_start.h移动到LED文件夹下面;如下图所示:
然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;如下所示:
将LED的驱动文件gd32f407v_start.c和main.c别添加到项目文件中;如下所示:
将LED的头文件也添加到Keil的环境中;如下所示:
最后我们把main.c文件做全部的替换,替换为如下的代码:
/*----------------------------------------------------------------------------
* CMSIS-RTOS 'main' function template
*---------------------------------------------------------------------------*/
#include "RTE_Components.h"
#include CMSIS_device_header
#include "cmsis_os2.h"
#include "gd32f4xx.h"
#include "gd32f407v_start.h"
/*
*********************************************************************************************************
* ±ê×¼¿â
*********************************************************************************************************
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*
**********************************************************************************************************
º¯ÊýÉùÃ÷
**********************************************************************************************************
*/
void AppTaskLED(void *argument); //AppTaskLED ÈÎÎñ : LED ÉÁ˸¡£
void AppTaskStart(void *argument);
//osRtxTimerThread ÈÎÎñ: ¶¨Ê±Æ÷ÈÎÎñ£¬ÔÝδʹÓá£
/*
**********************************************************************************************************
±äÁ¿
/// Attributes structure for thread.
typedef struct {
const char *name; ///< name of the thread //ÈÎÎñÃû
uint32_t attr_bits; ///< attribute bits //ÈÎÎñÊôÐÔ£¬Ö§³Ö¶ÀÁ¢ Detached ºÍÁªºÏ Joinable Á½ÖÖģʽ
void *cb_mem; ///< memory for control block //ÈÎÎñ¿ØÖÆ¿éµØÖ·
uint32_t cb_size; ///< size of provided memory for control block //ÈÎÎñ¿ØÖÆ¿é´óС£¨µ¥Î»£º×Ö½Ú£©
void *stack_mem; ///< memory for stack //ÈÎÎñÕ»µØÖ·
uint32_t stack_size; ///< size of stack //ÈÎÎñÕ»´óС£¨µ¥Î»£º×Ö½Ú£©
osPriority_t priority; ///< initial thread priority (default: osPriorityNormal) //ÈÎÎñÓÅÏȼ¶ (ĬÈÏ: osPriorityNormal)
TZ_ModuleId_t tz_module; ///< TrustZone module identifier //TrustZone ±êʶ·û
uint32_t reserved; ///< reserved (must be 0) //ĬÈϱ£Áô²ÎÊý (±ØÐëÊÇ 0)
} osThreadAttr_t;
**********************************************************************************************************
*/
/* ÈÎÎñµÄÊôÐÔÉèÖà */
const osThreadAttr_t ThreadStart_Attr =
{
/* δʹÓà */
// .cb_mem = &worker_thread_tcb_1,
// .cb_size = sizeof(worker_thread_tcb_1),
// .stack_mem = &worker_thread_stk_1[0],
// .stack_size = sizeof(worker_thread_stk_1),
// .priority = osPriorityAboveNormal,
// .tz_module = 0
.name = "osRtxStartThread",
.attr_bits = osThreadDetached,
.priority = osPriorityHigh4,
.stack_size = 128,
};
const osThreadAttr_t ThreadLED_Attr =
{
.name = "osRtxLEDThread",
.attr_bits = osThreadDetached,
.priority = osPriorityHigh2,
.stack_size = 128,
};
/* ÈÎÎñ¾ä±ú */
osThreadId_t ThreadIdTaskLED = NULL;
osThreadId_t ThreadIdStart = NULL;
///*----------------------------------------------------------------------------
// * Application main thread
// *---------------------------------------------------------------------------*/
//__NO_RETURN static void app_main (void *argument) {
// (void)argument;
// // ...
// for (;;) {}
//}
int main (void) {
// System Initialization
nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
/* configure led GPIO */
gd_eval_led_init(LED2);
osKernelInitialize(); // Initialize CMSIS-RTOS
ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr); // Create application main thread
osKernelStart(); // Start thread execution
for (;;) {}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskStart
* ¹¦ÄÜ˵Ã÷: Æô¶¯ÈÎÎñ£¬ÕâÀïÓÃ×÷BSPÇý¶¯°ü´¦Àí¡£
* ÐÎ ²Î: ÎÞ
* ·µ »Ø Öµ: ÎÞ
* ÓÅ ÏÈ ¼¶: osPriorityHigh4
*********************************************************************************************************
*/
void AppTaskStart(void *argument)
{
/* ´´½¨ÈÎÎñ */
ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskLED
* ¹¦ÄÜ˵Ã÷: LEDÉÁ˸¡£
* ÐÎ ²Î: ÎÞ
* ·µ »Ø Öµ: ÎÞ
* ÓÅ ÏÈ ¼¶: osPriorityHigh2
*********************************************************************************************************
*/
void AppTaskLED(void *argument)
{
while(1)
{
gd_eval_led_toggle(LED2);
osDelay(100);
}
}
重新编译,结果如下:
然后下载程序到MCU中,开发板上LED灯出现闪烁;移植成功。
完整的项目分享如下: https://download.csdn.net/download/praguejing/89633553