【GD32E503评测03】 5分钟移植好FreeRTOS到GD32E503
[复制链接]
本帖最后由 caizhiwei 于 2021-1-19 22:17 编辑
1. 利用MDK5超强大的功能,可以实现FreeRTOS的快速移植。
首先,打开MDK的Pack工具包,勾线FreeRTOS中间件:
到这里后,编译肯定有3个报错,三个函数已经重复定义了:
在 FreeRTOSConfig.h中有如下三个接口的定义:
/* Map the FreeRTOS port interrupt handlers to their CMSIS standard names. */
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
在gd32e50x_it.c 需要屏蔽掉这些函数即可。
/*!
\brief this function handles SVC exception
\param[in] none
\param[out] none
\retval none
*/
//void SVC_Handler(void)
//{
//}
/*!
\brief this function handles DebugMon exception
\param[in] none
\param[out] none
\retval none
*/
void DebugMon_Handler(void)
{
}
/*!
\brief this function handles PendSV exception
\param[in] none
\param[out] none
\retval none
*/
//void PendSV_Handler(void)
//{
//}
/*!
\brief this function handles SysTick exception
\param[in] none
\param[out] none
\retval none
*/
//void SysTick_Handler(void)
//{
// delay_decrement();
//}
第三部,添加上我们我们的任务创建函数即可:
#include "systick.h"
#include "gd32e503v_eval.h"
#include "gd32e503v_lcd_eval.h"
#include "bsp_touch.h"
#include "picture.h"
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#define LED1_TASK_PRIO ( tskIDLE_PRIORITY + 2 )
void LED1_task(void * pvParameters);
static void led_init(void)
{
/* initialize the leds */
gd_eval_led_init(LED1);
gd_eval_led_init(LED2);
gd_eval_led_init(LED3);
gd_eval_led_init(LED4);
/* close all of leds */
gd_eval_led_off(LED1);
gd_eval_led_off(LED2);
gd_eval_led_off(LED3);
gd_eval_led_off(LED4);
}
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
//systick_config();
led_init();
/* configure EVAL_COM0 */
gd_eval_com_init(EVAL_COM0);
/* configure TAMPER key */
gd_eval_key_init(KEY_B, KEY_MODE_GPIO);
printf("\r\nHello,eeworld!");
/* configure the GPIO of SPI touch panel */
touch_panel_gpio_configure();
//delay_1ms(50);
/* configure the EXMC access mode */
exmc_lcd_init();
/* initialize the LCD */
lcd_init();
/* clear the LCD screen */
lcd_clear(LCD_COLOR_WHITE);
uint8_t len_s;
char *str;
uint16_t i;
char_format_struct char_format;
char error_string[]="Hello,EEWORLD!";
/* draw character on LCD screen */
len_s = sizeof(error_string)-1;
str = error_string;
// /* configure char format */
// char_format.char_color = LCD_COLOR_RED;
// char_format.bk_color = LCD_COLOR_WHITE;
// char_format.direction = CHAR_DIRECTION_VERTICAL;
// char_format.font = CHAR_FONT_8_16;
//
// for (i = 0; i < len_s; i++)
// {
// lcd_char_display((8*i), 100 + 24, *str++, char_format);
// }
/* configure char format */
char_format.char_color = LCD_COLOR_BLUE;
char_format.bk_color = LCD_COLOR_WHITE;
char_format.direction = CHAR_DIRECTION_VERTICAL;
char_format.font = CHAR_FONT_16_24;
for (i = 0; i < len_s; i++)
{
lcd_char_display((16*i), 10, *str++, char_format);
}
/* 设置优先级分组为4,16个优先级全是抢占优先级 */
nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
xTaskCreate(LED1_task, "LED1", configMINIMAL_STACK_SIZE, NULL, LED1_TASK_PRIO, NULL);
/* start scheduler */
vTaskStartScheduler();
while(1){
}
}
void LED1_task(void * pvParameters)
{
for( ;; ){
/* toggle LED2 each 500ms */
gd_eval_led_toggle(LED1);;
vTaskDelay(100);
}
}
最后编译OK,下载运行,LED开始闪烁,OS已经运行起来了!
是不是很简单,没有复杂的 各种文件的添加到工程等等。
欢迎多多交流~
|