首页 > 其他分享 >全网最迅速的移植FreeRTOS到天空星GD32F407VET6

全网最迅速的移植FreeRTOS到天空星GD32F407VET6

时间:2024-12-05 11:31:23浏览次数:11  
标签:none ms FreeRTOS void 全网 GD32F407VET6 Handler param 延时

注:最最最重要的若出现如图所示问题,请按第二张图片操作

1、添加FreeRTOS源码

        将我分享的文件复制粘贴到需要移植的开发板例程文件中

2、向工程分组中添加文件

打开基础工程,新建分组FreeRTOS_CORE和FreeRTOS_PORTABLE,然后向这两个分组 中添加文件,如图所示:

3、添加相应的头文件路径添加完FreeRTOS 源码中的 C 文件以后还要添加FreeRTOS源码的头文件路径,头文件路径如图所示:

1:修改 FreeRTOSConfig.h文件

由于我分享的FreeRTOSConfig.h文件已经基本改好,所以不再讲解如何改,接下来讲其他文件的更改。

2:修改 Board文件

复制此代码代替原Board.c

#include <stdint.h>
#include <board.h>
#include "FreeRTOS.h"
#include "task.h"

extern void xPortSysTickHandler(void);
static __IO uint32_t g_system_tick = 0;
static uint8_t  fac_us=0;			//us延时倍乘数			   
static uint16_t fac_ms=0;			//ms延时倍乘数,在rtos下,代表每个节拍的ms数

/*!
    \brief      this function handles NMI exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void NMI_Handler(void)
{
}

/*!
    \brief      this function handles HardFault exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void HardFault_Handler(void)
{
    /* if Hard Fault exception occurs, go to infinite loop */
    while(1) {
    }
}

/*!
    \brief      this function handles MemManage exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void MemManage_Handler(void)
{
    /* if Memory Manage exception occurs, go to infinite loop */
    while(1) {
    }
}

/*!
    \brief      this function handles BusFault exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void BusFault_Handler(void)
{
    /* if Bus Fault exception occurs, go to infinite loop */
    while(1) {
    }
}

/*!
    \brief      this function handles UsageFault exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void UsageFault_Handler(void)
{
    /* if Usage Fault exception occurs, go to infinite loop */
    while(1) {
    }
}

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void Error_Handler(void)
{
    /* USER CODE BEGIN Error_Handler */
    /* User can add his own implementation to report the HAL error return state */
    while (1)
    {
    }
    /* USER CODE END Error_Handler */
}


//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
void systick_config(void)
{
	uint32_t reload;
	systick_clksource_set(SYSTICK_CLKSOURCE_HCLK);//选择外部时钟  HCLK
	fac_us=SystemCoreClock/1000000;				//不论是否使用OS,fac_us都需要使用
	reload=SystemCoreClock/1000000;				//每秒钟的计数次数 单位为M  
	reload*=1000000/configTICK_RATE_HZ;			//根据configTICK_RATE_HZ设定溢出时间
												//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右	
	fac_ms=1000/configTICK_RATE_HZ;				//代表OS可以延时的最少单位	   
 
	SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;   	//开启SYSTICK中断
	SysTick->LOAD=reload; 						//每1/configTICK_RATE_HZ秒中断一次	
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   	//开启SYSTICK   	
}

/*!
    \brief      this function handles SysTick exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void SysTick_Handler(void){
    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//假如系统已经运行
    {
        xPortSysTickHandler();
    }
}

uint32_t get_system_tick(void)
{
    return g_system_tick;
}

/**
 * This function will initial GD32 board.
 */
void board_init(void)
{
    /* NVIC Configuration */
#define NVIC_VTOR_MASK              0x3FFFFF80
#ifdef  VECT_TAB_RAM
    /* Set the Vector Table base location at 0x10000000 */
    SCB->VTOR  = (0x10000000 & NVIC_VTOR_MASK);
#else  /* VECT_TAB_FLASH  */
    /* Set the Vector Table base location at 0x08000000 */
    SCB->VTOR  = (0x08000000 & NVIC_VTOR_MASK);
#endif

    systick_config();

}


//延时nus
//nus为要延时的us数.		    								   
void delay_us(uint32_t nus)
{		
	uint32_t ticks;
	uint32_t told,tnow,tcnt=0;
	uint32_t reload=SysTick->LOAD;	//LOAD的值	    	 
	ticks=nus*fac_us; 				//需要的节拍数 
	told=SysTick->VAL;        		//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;		//时间超过/等于要延迟的时间,则退出.
		}  
	}									    
}
 
 
//延时nms
//nms:要延时的ms数,会引起任务调度
void delay_ms(uint16_t nms)
{	
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
	{		
		if(nms>=fac_ms)						//延时的时间大于OS的最少时间周期 
		{ 
   			vTaskDelay(nms/fac_ms);	 		//FreeRTOS延时
		}
		nms%=fac_ms;						//OS已经无法提供这么小的延时了,采用普通方式延时    
	}
	delay_us((uint32_t)(nms*1000));				//普通方式延时
}
 
 
//延时nms,不会引起任务调度
//nms:要延时的ms数
void delay_xms(uint32_t nms)
{
	uint32_t i;
	for(i=0;i<nms;i++) delay_us(1000);
}

3:修改 main.c文件

将以下代码移植到main.c即可

#include "board.h"
#include "bsp_led.h"
#include "bsp_uart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "oled.h"
//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
 
//任务优先级
#define LED1_TASK_PRIO		3
//任务堆栈大小	
#define LED1_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void LED_Thread1(void *pvParameters);
 
//任务优先级
#define LED2_TASK_PRIO		4
//任务堆栈大小	
#define LED2_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED2Task_Handler;
//任务函数
void LED_Thread2(void *pvParameters);
 
int main(void)
{
    board_init();
	bsp_led_init(); // 初始化板上LED
	bsp_uart_init(); // 初始化uart
	
  //创建开始任务
	xTaskCreate((TaskFunction_t )start_task,            //任务函数
							(const char*    )"start_task",          //任务名称
							(uint16_t       )START_STK_SIZE,        //任务堆栈大小
							(void*          )NULL,                  //传递给任务函数的参数
							(UBaseType_t    )START_TASK_PRIO,       //任务优先级
							(TaskHandle_t*  )&StartTask_Handler);   //任务句柄   
							
	vTaskStartScheduler();          //开启任务调度
		
}
 
 
//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED1任务
    xTaskCreate((TaskFunction_t )LED_Thread1,     	
                (const char*    )"led1_task",   	
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED1_TASK_PRIO,	
                (TaskHandle_t*  )&LED1Task_Handler);   
 
 
	    xTaskCreate((TaskFunction_t )LED_Thread2,     	
                (const char*    )"led2_task",   	
                (uint16_t       )LED2_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED2_TASK_PRIO,	
                (TaskHandle_t*  )&LED2Task_Handler);   
													
							
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
 
}
 
//LED1任务函数 
void LED_Thread1(void *pvParameters)
{
    while(1)
    {
      bsp_led_on(LED1);
      delay_ms(100);
    }
} 
 
//LED2任务函数 
void LED_Thread2(void *pvParameters)
{
    
    while(1)
    {
	  bsp_led_off(LED1);
      delay_ms(250);
     
    }
}  

到这里就可以正常使用了,各位可以按照教程移植,也可直接去我主页下载我的链接直接使用,如果有什么错误还请各位大佬指示,最后各位老铁如果觉得可以还请点个小赞❤

标签:none,ms,FreeRTOS,void,全网,GD32F407VET6,Handler,param,延时
From: https://blog.csdn.net/weixin_72011965/article/details/144176776

相关文章

  • Sqli-labs,sql注入靶场less1 全网最详细,每条命令都有详解
    一、less1基于错误的GET单引号字符型注入1、观察到页面输入?id=1后返回正常页面,把id=2也返回正常页面,在id=3的后面加入单引号出现报错,由此判断存在sql注入2、接下来我们可以使用mysql的union联合查询的方式来进行漏洞利用,由于union内部的select语句必须拥有相同的列,要不会报......
  • 全网最全情景,深入浅出解析JavaScript数组去重:数值与引用类型的全面攻略
    目录全网最全情景,深入浅出解析JavaScript数组去重:数值与引用类型的全面攻略一、引言:我们为什么需要关注数组去重?二、数值类去重1、使用Set去重2、遍历+includes()3、使用filter()和indexOf()4、使用reduce()5、嵌套数组去重:结合flat()三、引用类去重——去除......
  • 【全网最新最全】VMware15.5.1 安装教程
    首先百度下载VMware安装包,然后右键管理员运行 点击下一步:再点击下一步:点击下一步:点击下一步:点击下一步:点击安装,等待安装完成。......
  • 网络安全必看—全网最全的命令执行绕过总结分享,黑客技术零基础入门到精通教程
    1基础知识$包裹的内容会被bash进行解析如下1.$""2.$''3.$()4.\`$id\`$包裹的内容增添包裹,有可能会持续深入解析如下,我们在test目录新建了一个whoami,当我们用(l......
  • 犀牛导入FLAC3D全网最详细教程
    ......
  • 全网唯一的高性能在线客服系统源码(开源代码+终身使用+安装教程)
    本系统采用GolangGin框架+GORM+MySQL+Vue+ElementUI开发的独立高性能在线客服系统。客服系统访客端支持PC端、移动端、小程序、公众号中接入客服,利用超链接、网页内嵌、二维码、定制对接等方式让网上所有通道都可以快速通过本系统联系到商家。服务端可编译为二进制程序包,无需......
  • 短视频矩阵 saas,开发速度能多快?(全网最全源码)
    短视频矩阵系统,带来全网最为全面的源代码分享。        抖音营销矩阵管理系统,望文生义,就是把多个账号集中于抖音平台之上,同步进行各不相同的内容推送。当下,抖音官方正在大力推广的一项功能便是:矩阵投放。抖音营销矩阵管理系统的核心功能在于:多账号授权,大量生产视频内......
  • 全网独家创新:Damo-YOLO与Dyhead检测头引领YOLOv8极限突破【YOLOv8】
    本专栏专为AI视觉领域的爱好者和从业者打造。涵盖分类、检测、分割、追踪等多项技术,带你从入门到精通!后续更有实战项目,助你轻松应对面试挑战!立即订阅,开启你的YOLOv8之旅!专栏订阅地址:https://blog.csdn.net/mrdeam/category_12804295.html文章目录全网独家创新:Damo-YOLO......
  • 全网最低价 | 全家桶持续更新!
    往期精彩内容:时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较全是干货|数据集、学习资料、建模资源分享!EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客拒绝信息泄露!VMD滚动分解+Informer-BiLSTM并行预测模型-CSDN博客风速预测(一)数据集介绍和预处理_风......
  • 深入理解 FreeRTOS 队列集(建议收藏!!!)
    在FreeRTOS操作系统这个“大家庭”里,队列集扮演着一个特殊的“管家”角色,它让多个队列之间的协作变得井井有条。一、队列集的基本概念队列集就像是一个专门用来存放其他队列“钥匙”(句柄)的盒子。假设我们有队列A这个“小仓库”,它能存放LengthA数量的“宝贝”(数......