BinWin 发表于 2021-2-22 23:00

【AT-START-F407测评】 移植 RTX5 点亮LED

   过去了这么久,现在才拿起些许灰尘的AT32,白色的板子倒是几分熟悉感,整体看一下,USB, FLASH,ETH比较着重的几点,这款MCU作为数据通信来用应该比较合适。
   进入正题,首先准备一个基本工程。这里直接使用BSP文件中的Templates工程模板。在RTE环境中已源码形式添加RTX即可, 左下角的按钮可以方便的解决缺少组件的问题。如图,然后点击OK
   
   这时候选择编译一下,看看有哪些错误,比如
error:#35: #error directive: "Unknown Arm Architecture!"    这是由于使用了固件库文件中的cmsis_armcc.h,打开BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\CoreSupport文件夹,把同名文件改名字或删除   
    这时候再编译,上面说的错误已经消失了。然而还是有错误信息存在
   
   这个问题确实不好查,百度后竟有朋友遇到相同的问题,修改方式是这样的
   
   接下来不出意外依然是有问题的,这个比较常见了,重复的中断定义,注释固件库中的中断服务函数掉即可。

到这里,系统已经没问题了,RTX成功的加入到了工程代码中,再做一些基本配置,整体是这样的

剩下的事情就是编写应用代码了,点灯是必经之路,创建两个任务线程,一个LED闪烁,使用相对延时方式。一个串口打印任务,波特率9600。代码可以是这样的
/*----------------------------------------------------------------------------
* CMSIS-RTOS 'main' function template
*---------------------------------------------------------------------------*/

#include "RTE_Components.h"
#includeCMSIS_device_header
#include "cmsis_os2.h"

#include "at32_board.h"
#include <stdio.h>

const osThreadAttr_t ThreadLED_Attr =
{
        .name = "osRtxLEDThread",
        .attr_bits = osThreadDetached,
        .priority = osPriorityHigh2,
        .stack_size = 512,
};

const osThreadAttr_t ThreadMsg_Attr =
{
        .name = "osRtxMsgThread",
        .attr_bits = osThreadDetached,
        .priority = osPriorityHigh3,
        .stack_size = 1024,
};

const osThreadAttr_t ThreadStart_Attr =
{
        .name = "osRtxStartThread",
        .attr_bits = osThreadDetached,
        .priority = osPriorityHigh4,
        .stack_size = 2048,
};

osThreadId_t ThreadIdTaskMsg = NULL;
osThreadId_t ThreadIdTaskLED = NULL;
osThreadId_t ThreadIdStart = NULL;


void AppTaskLED(void *argument)
{
        const uint16_t usFrequency = 500; /* ÑÓ³ÙÖÜÆÚ */
        uint32_t tick;

        /* »ñÈ¡µ±Ç°Ê±¼ä */
        tick = osKernelGetTickCount();

       
    while(1)
    {
                AT32_LEDn_Toggle(LED2);
                /* Ïà¶ÔÑÓ³Ù */
                tick += usFrequency;                        
                osDelayUntil(tick);
    }

}

void AppTaskMsg(void *argument)
{
        while(1)
        {
                printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
                osDelay(1000);
        }       
}

static void AppTaskCreate (void)
{
        ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);
        ThreadIdTaskMsg = osThreadNew(AppTaskMsg, NULL, &ThreadMsg_Attr);       
}

void AppTaskStart(void *argument)
{
        const uint16_t usFrequency = 1; /* ÑÓ³ÙÖÜÆÚ */
        uint32_t tick;
       

        AT32_Board_Init();

        /* ´´½¨ÈÎÎñ */
        AppTaskCreate();

        /* »ñÈ¡µ±Ç°Ê±¼ä */
        tick = osKernelGetTickCount();
       
    while(1)
    {
               
                /* Ïà¶ÔÑÓ³Ù */
                tick += usFrequency;                        
                osDelayUntil(tick);
    }
}



int main (void) {

// System Initialization
SystemCoreClockUpdate();
// ...

       
osKernelInitialize();               // Initialize CMSIS-RTOS
       
       
       
ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);
       
osKernelStart();                      // Start thread execution
for (;;) {}
}
   然后编译下载就可以看到串口助手愉快的输出信息了。
   
   为止,AT32F407可以正常运行RTX内核了,接下来移植网络中间件。


   

xrb3115 发表于 2021-2-24 01:12

支持一下,这个网络协议栈应该还是挺好的

caizhiwei 发表于 2021-2-24 08:39

xrb3115 发表于 2021-2-24 01:12
支持一下,这个网络协议栈应该还是挺好的

这个明明是RTOS,不是网络协议栈

xrb3115 发表于 2021-2-24 11:30

caizhiwei 发表于 2021-2-24 08:39
这个明明是RTOS,不是网络协议栈

楼主不是准备继续移植网络中间件嘛,我是说这个协议栈挺好的
页: [1]
查看完整版本: 【AT-START-F407测评】 移植 RTX5 点亮LED