发新帖本帖赏金 20.00元(功能说明)我要提问
返回列表
打印
[活动专区]

【AT-START-F437测评】THREADX + FILEX

[复制链接]
1625|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【AT-START-F437测评】THREADX + FILEX

THREADX 作为世界第一梯队的RTOS,如今已归微软旗下,拥有者诸多安全认证:
航空领域 – ED-12B, DO-178B, ED-109, ED-278
医学领域 – IEC-60601, IEC-62304, ISO-14971, FDA 510(k)
工业领域– IEC-61508, and others
运输领域 – CENELEC EN50128, 49CFR236, IEC-61508

该RTOS虽然不是完全免版税,但也有这个趋势,至少在STM32、NXP、瑞萨芯片上已经可以免费使用了。

FILEX做为THREADX的配套组件之一,同样拥有如上安全认证。

这几天拿AT32F437评估板测试THREADX和FILEX,记录一下使用情况。

=========================================================
首先是THREADX,不得不说微软的移植工作做的非常细致,各种常见内核都已做好适配,使用时只需要添加官方移植好的M4文件就可以。
如下图所示部分选择port/cortex_m4下的文件即可。

其中 tx_initialize_low_level.S 文件内的时钟需要配置一下:

SYSTEM_CLOCK      =   288000000

SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 500) -1)

AT32F437主频288MHz,上面配置系统TICK为2ms。
THREADX这么一点配置基本就可以跑起来了。

==========================================================
FILEX需要移植一个文件,主要用来实现USB DISK的读写操作,USB 读写参考AT32官方例程即可。
移植内容如下:

#include <string.h>

#include "usbh_user.h"
#include "bsp.h"
#include "tx_api.h"
#include "fx_api.h"
#include "usb_core.h"
#include "usbh_msc_class.h"
#include "common.h"                 

/* Handle for USB Host */
extern otg_core_type otg_core_struct;

UINT  _fx_partition_offset_calculate(void  *partition_sector, UINT partition, ULONG *partition_start, ULONG *partition_size);

static uint8_t sector_read(void *buff, uint32_t sec_site, uint32_t amount);
static uint8_t sector_write(void *buff, uint32_t sec_site, uint32_t amount);


/**
  * [url=home.php?mod=space&uid=247401]@brief[/url] This function is the entry point to the STM32 SDIO disk driver.     */
/*        It relies on the STM32 peripheral library from ST.
* @param None
* @retval None
*/
VOID  fx_udisk_driver(FX_MEDIA *media_ptr)
{
    int32_t status;
    ULONG       partition_start;
    ULONG       partition_size;

    /* before performing any operation, check the status of the SDMMC */
    if(usbh_msc_is_ready(&otg_core_struct.host, 0) != MSC_OK)
    {
        media_ptr->fx_media_driver_status = FX_IO_ERROR;
        return;
    }

    /* Process the driver request specified in the media control block.  */
    switch (media_ptr->fx_media_driver_request)
    {
        case FX_DRIVER_INIT:
        {
            if(usbh_msc_is_ready(&otg_core_struct.host, 0) == MSC_OK)
            {
                media_ptr->fx_media_driver_status = FX_SUCCESS;
            }
            else
            {
                media_ptr->fx_media_driver_status = FX_IO_ERROR;
            }

            break;
        }

        case FX_DRIVER_UNINIT:
        {
            /* Successful driver request.  */
            media_ptr->fx_media_driver_status = FX_SUCCESS;
            break;
        }

        case FX_DRIVER_READ:
        {
            status = sector_read(
                media_ptr->fx_media_driver_buffer,
                media_ptr->fx_media_driver_logical_sector + media_ptr->fx_media_hidden_sectors,
                media_ptr->fx_media_driver_sectors
                );

            if (status == 0)
                media_ptr->fx_media_driver_status = FX_SUCCESS;
            else
                media_ptr->fx_media_driver_status = FX_IO_ERROR;

            break;
        }

        case FX_DRIVER_WRITE:
        {
            status = sector_write(
                media_ptr->fx_media_driver_buffer,
                media_ptr->fx_media_driver_logical_sector + media_ptr->fx_media_hidden_sectors,
                media_ptr->fx_media_driver_sectors
                );


            if (status == 0)
                media_ptr->fx_media_driver_status = FX_SUCCESS;
            else
                media_ptr->fx_media_driver_status = FX_IO_ERROR;

            break;
        }

        case FX_DRIVER_FLUSH:
        {
            /* Return driver success.  */
            media_ptr->fx_media_driver_status = FX_SUCCESS;
            break;
        }

        case FX_DRIVER_ABORT:
        {
            /* Return driver success.  */
            media_ptr->fx_media_driver_status = FX_SUCCESS;
            break;
        }

        case FX_DRIVER_BOOT_READ:
        {
            status = sector_read(
                media_ptr->fx_media_driver_buffer,
                0,
                1);


            if (status == 0)
            {
                media_ptr->fx_media_driver_status = FX_SUCCESS;
            }
            else
            {
                media_ptr->fx_media_driver_status = FX_IO_ERROR;
                break;
            }

            /* Check if the sector 0 is the actual boot sector, otherwise calculate the offset into it.
            Please note that this should belong to higher level of MW to do this check and it is here
            as a temporary work solution */

            partition_start = 0;

            status = _fx_partition_offset_calculate(media_ptr->fx_media_driver_buffer, 0,
                &partition_start, &partition_size);

            /* Check partition read error.  */
            if (status)
            {
                /* Unsuccessful driver request.  */
                media_ptr->fx_media_driver_status = FX_IO_ERROR;
                return;
            }

            /* Now determine if there is a partition...   */
            if (partition_start)
            {
                /* Yes, now lets read the actual boot record.  */
                status = sector_read(
                    media_ptr->fx_media_driver_buffer,
                    partition_start,
                    1);

                /* Check status of SDIO Read.  */
                if (status != 0)
                {

                    /* Unsuccessful driver request.  */
                    media_ptr->fx_media_driver_status = FX_IO_ERROR;
                    return;
                }
            }

            /* Successful driver request.  */
            media_ptr->fx_media_driver_status = FX_SUCCESS;
            break;
        }
        case FX_DRIVER_BOOT_WRITE:
        {
            status = sector_write(
                media_ptr->fx_media_driver_buffer,
                0,
                1
                );

            if (status == 0)
                media_ptr->fx_media_driver_status = FX_SUCCESS;
            else
                media_ptr->fx_media_driver_status = FX_IO_ERROR;

            break;
        }
        default:
        {
            media_ptr->fx_media_driver_status = FX_IO_ERROR;
            break;
        }
    }
}

uint8_t sector_read(void *buff, uint32_t sec_site, uint32_t count)
{
  usb_sts_type status;
  
  status = usbh_msc_read(&otg_core_struct.host, sec_site, count, buff, 0);
  
  if(status == USB_OK)
    return 0;
  
  return 1;
}

uint8_t sector_write(void *buff, uint32_t sec_site, uint32_t count)
{
  usb_sts_type status;

  status = usbh_msc_write(&otg_core_struct.host, sec_site, count, (uint8_t *)buff, 0);
  
  if(status == USB_OK)
    return 0;
  
  return 1;
}
应用测试代码比较多,不贴在这里了,感兴趣的小伙伴可以从贴尾链接下载代码测试。
下面是测试结果:
烧录程序运行后,插入U盘开始U盘操作。串口显示内容如下:

U盘操作完后接入电脑,多出两个文件是本测试程序创建的:

一个CSV表格,一个PDF文件。

表格文件内容:

PDF文件比较长,截取一部分如下:

这就完了,微软出品的软件确实比较容易上手。系统默认配置,底层移植量非常少就能跑起来。后面可以细致研究OS和文件系统的各个API用法了。

代码托管在GITEE:
https://toscode.gitee.com/aple_sun/at32f437-start-threadx


使用特权

评论回复

打赏榜单

ArterySW 打赏了 20.00 元 2023-01-06
理由:【AT-START-F437测评】THREADX FILEX,作品优秀。

评论
forgot 2023-1-17 09:03 回复TA
给楼主点个赞 
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

328

帖子

2

粉丝