手把手讲解RTX5操作系统在GD32F407上的移植

对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 后面打钩后默认是库文件,我们更改为源文件);
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0f754679975f4d1fb516ecae56c1af03.png

①:Manage Run-Time Environment的环境对话框;
②:需要选择进行打钩的部分,其中标准库文件部分全部选择
③:如果此处有提示警告或错误,或者在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

### 回答1: STM32F103是STMicroelectronics(意法半导体)推出的一款32位ARM Cortex-M3内核的微控制器系列产品。而RTX则是Keil MDK(Microcontroller Development Kit)中提供的一种实时操作系统,用于在嵌入式系统中管理任务和资源。 要配置STM32F103的RTX,首先需要安装MDK-ARM开发环境和ST-Link驱动程序。接下来,可以使用Keil MDK提供的"CubeMX"工具生成工程代码,其中包括了RTX的配置。 在CubeMX中,可以选择需要的外设和引脚功能,然后配置RTOS(RTX)选项。在RTOS选项中,可以选择启用RTX,并设置时钟频率以及堆栈和线程的大小。还可以设置RTOS的优先级和任务调度方式等相关参数。 配置完毕后,CubeMX会自动生成代码,并生成工程的HAL(Hardware Abstract Layer)驱动文件。接下来,可以使用Keil MDK打开该工程,并将生成的代码添加到工程中。然后,编写应用程序代码,利用RTX提供的API函数来创建任务、互斥信号量、消息队列、定时器等,实现所需的多任务管理和资源共享。 最后,通过编译、烧录和调试,可以将配置好的RTX程序部署到STM32F103微控制器上运行。在运行过程中,RTX会按照设定的优先级和任务调度方式来管理系统中的任务和资源,确保多任务的协调和实时性。 总之,配置STM32F103的RTX需要安装MDK-ARM开发环境、ST-Link驱动程序和CubeMX工具,通过CubeMX生成RTX的配置代码,然后结合Keil MDK编写应用程序代码,并最终将程序烧录到STM32F103上运行。这样,就可以实现对STM32F103的多任务管理和实时操作系统的使用。 ### 回答2: STM32F103是STMicroelectronics推出的一款基于ARM Cortex-M3内核的32位微控制器。RTX(Real-Time eXecutive)是Keil MDK软件套件中的一个实时操作系统RTOS),用于编写实时响应和多任务应用程序。 要对STM32F103进行RTX配置,可以按照以下步骤进行操作: 1. 下载安装Keil MDK软件套件,并打开Keil uVision5集成开发环境。 2. 在工程目录下创建一个新的工程,并选择正确的STM32F103系列芯片作为目标设备。 3. 在源文件夹中创建一个名为"cmsis_os.c"的新文件,并在文件中包含"CMSIS/RTOS2/Include/cmsis_os2.h"头文件。 4. 在"cmsis_os.c"文件中定义一个全局变量作为操作系统对象: ```c osKernelState_t osKernelRunning; // 操作系统状态 ``` 5. 在"main.c"文件中,添加以下代码以初始化RTX: ```c #include "cmsis_os2.h" int main(void) { osKernelInitialize(); // 初始化操作系统 osKernelRunning = osKernelRunning; // 设置操作系统状态为运行中 osKernelStart(); // 启动操作系统 while(1) {} // 进入主循环,等待任务执行 } ``` 6. 在工程配置(Options for Target)中,选择RTX作为操作系统,并设置正确的操作系统堆栈大小和任务堆栈大小。 7. 在工程目录中创建一个新的任务文件,并在文件中定义一个任务函数。例如,创建一个名为"task1.c"的新文件,并添加以下代码: ```c #include "cmsis_os2.h" void task1(void *argument) { while(1) { // 任务执行的代码 } } ``` 8. 在"main.c"文件中添加以下代码以创建并启动任务: ```c #include "cmsis_os2.h" extern void task1(void *argument); // 声明任务函数 int main(void) { // ... osThreadNew(task1, NULL, NULL); // 创建并启动任务 // ... } ``` 9. 编译并下载程序到STM32F103芯片上,并通过调试器进行调试。 通过以上步骤,你可以在STM32F103上成功配置和使用RTX实时操作系统,并编写适用于该微控制器的实时响应和多任务应用程序。注意在编写任务代码时,需要遵循RTX的API规范和RTOS的原则,确保任务能够按照预期执行。 ### 回答3: stm32f103系列是意法半导体推出的一款高性能微控制器,它采用了高性能ARM Cortex-M3内核,拥有丰富的外设和强大的处理能力。 RTX是一种优秀的实时操作系统,可以帮助开发者更好地管理任务调度和资源分配,提高系统的稳定性和可靠性。在stm32f103中配置RTX需要以下步骤: 1. 首先,下载并安装Keil MDK开发环境,该软件包含了RTX实时操作系统。 2. 打开Keil MDK,创建一个新的项目。 3. 在创建项目时,可以选择指定所需的STM32F103系列设备。 4. 在项目创建完成后,需要添加RTX的库文件。可以在Keil MDK的安装目录中找到RTX的库文件,添加到项目中。 5. 配置RTX的相关参数。可以通过在项目中创建的配置文件中修改相关参数,例如任务的优先级、堆栈大小等。 6. 在主函数中,初始化RTX,并创建需要的任务。可以使用RTX的API函数来创建任务和设置任务的优先级。 7. 在任务中,可以编写需要实现的功能代码。可以使用RTX提供的API函数来实现任务间的通信和同步,提高系统的效率。 8. 最后,编译和下载代码到stm32f103系列设备,即可开始测试和运行。 需要注意的是,对于初学者来说,配置RTX可能会有一定的难度。建议参考官方的文档和示例代码,以便更好地理解和掌握配置RTX的方法。同时,也可以参考其他开发者的经验,通过网络上的论坛和社区进行交流和学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值