ARM技术论坛
直播中

最强海贼王

8年用户 1347经验值
擅长:MEMS/传感技术
私信 关注
[经验]

浅析基于GD32F427适配RTX4+调试组件Event Recorder

先上GD官网下载了PACK包和DEMO例程,打开01_GPIO_Running_LED例程修改了头文件路径,编译下载LED闪亮了,接下来就是以此例程移植RTX和调试组件了。

移植RTX:RTX4默认包含在MDK中移植非常简单

1.工程魔术棒里面Target开启RTX操作系统。

 title=

2.MDK安装目录查找RTX_Conf_CM.c复制到工程目录下并添加到工程中。

 title=

3.修改RTX_Conf_CM.c中Tick_Timer,时钟使用systick,主频200000000Hz,Tick 1000us。

 title=

4.屏蔽gd32f4xx_it.c中void SVC_Handler(void) void PendSV_Handler(void) void SysTick_Handler(void)三个中断函数

5.在main.c中增加头文件#include "RTL.h"

6.建立调度任务

移植调试组件:使用板载的GD_Link就能方便调试而不需要串口

1.打开Manage Run_Time Enviornment -> Compiler 选项中Event Recorder 和STDOUT

 title=

2.修改debug中trace中core clock为200MHz

 title=
 title=

3.使用调试组件需要包含头文件#include "EventRecorder.h"

4.初始化调试组件

/* 初始化 EventRecorder 并开启 */
    EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();

5.可以使用EventRecord发送数值并且可以使用printf了

6.同时也可以使用Event Statistics测试时间了

7.编译下载后打开调试功能,开始运行,调试组件自动输出

 title=

 title=

 title=

主要代码

#include "gd32f4xx.h"
    #include "gd32f427r_start.h"
    #include "systick.h"
    #include <stdio.h>
    
    #include "RTL.h"
    #include "EventRecorder.h"
    
    /*
    函数声明
    */
    static void AppTaskCreate (void);
    __task void AppTaskLED(void);
    __task void AppTaskStart(void);
    /*
    变量
    */
    static uint64_t AppTaskLEDStk[256/8]; /* 任务栈 */
    static uint64_t AppTaskStartStk[512/8]; /* 任务栈 */
    /* 任务句柄 */
    OS_TID HandleTaskLED = NULL;
    
    
    /*!
        \brief      main function
        \param[in]  none
        \param[out] none
        \retval     none
    */
    int main(void)  
     {  

         /* enable the LEDs GPIO clock */
        rcu_periph_clock_enable(RCU_GPIOC);

        /* configure LED1 GPIO port */
        gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
        gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
        /* reset LED1 GPIO pin */
        gpio_bit_reset(GPIOC, GPIO_PIN_6);

            /* enable the User Key GPIO clock */
        rcu_periph_clock_enable(RCU_GPIOA);

        /* configure key pin as input */
        gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);

        /* 创建启动任务 */
        os_sys_init_user (AppTaskStart, /* 任务函数 */
        2, /* 任务优先级 */
        &AppTaskStartStk, /* 任务栈 */
        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
        while(1)
        {

        }

    }  

    /\*  

    *   函 数 名: AppTaskLED
    *   功能说明: LED 闪烁
    *   形 参: 无
    *   返 回 值: 无
    *   优 先 级: 1 (数值越小优先级越低)  
        \*/  
        \\_\\_task void AppTaskLED(void)  
        {  
        static int numi = 0;  
        while(1)  
        {  

             EventStartA(0);         
             os_dly_wait(500);
             EventStopA(0);
             EventRecord2(1+EventLevelAPI,numi,numi);
             numi++;
             if((numi % 10) == 0)
                 printf("计数%d\r\n",numi);
             gpio_bit_write(GPIOC, GPIO_PIN_6, (bit_status)(1 - gpio_input_bit_get(GPIOC, GPIO_PIN_6)));

        }  
        }  
        /\*  

    *   函 数 名: AppTaskStart
    *   功能说明: 启动任务,也就是最高优先级任务。
    *   形 参: 无
    *   返 回 值: 无
    *   优 先 级: 2  
        \*/  
        \\_\\_task void AppTaskStart(void)  
        {  
        / _初始化 EventRecorder 并开启_ /  
        EventRecorderInitialize(EventRecordAll, 1U);  
        EventRecorderStart();  
        AppTaskCreate();  
        while(1)  
        {  

             os_dly_wait(500);

        }  
        }  
        /\*  

    *   函 数 名: AppTaskCreate
    *   功能说明: 创建应用任务
    *   形 参: 无
    *   返 回 值: 无  
        \*/  
        static void AppTaskCreate (void)  
        {  
        HandleTaskLED = os\\_tsk\\_create\\_user(AppTaskLED, / _任务函数_ /  

             1, /* 任务优先级 */
             &AppTaskLEDStk, /* 任务栈 */
             sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */

        }

原作者:兆易创新GD32 MCU 汪阳

更多回帖

发帖
×
20
完善资料,
赚取积分