sync
sync
This guy hasn't written anything yet

注册于 2 years ago

回答
95
文章
3
关注者
0

你的波特率是多少?写入到外部flash的时间是多少?第一次80K数据接收完毕,和第二次80k数据开始接收之间的间隔时间是多少?

中断里面,使用延时是不合适的,修改下程序吧

是的,关于虚拟文件系统的理解可以看这两个图片

输入链接说明
输入链接说明

可以参考RT-thread对串口的处理方式,使用消息队列来实现数据传递

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    struct rx_msg msg;
    rt_err_t result;
    msg.dev = dev;
    msg.size = size;

    result = rt_mq_send(&rx_mq, &msg, sizeof(msg));
    if (result == -RT_EFULL)
    {
        /* 消息队列满 */
        LOG_E("message queue full!");
    }

    return result;
}

这不就相当于循环延时吗?如果调用rt_thread_delay则将交出CPU控制权,所以使用循环来实现

硬件电路是485吗?1,2号从机,并联后,可以用示波器抓下波形看看,停顿2秒和不停顿直接切换波形上有无差异,排除硬件问题后,再专心调软件了

想了解原理就百度
https://blog.csdn.net/qq_20332637/article/details/82690755
想了解工作流程,直接下断点调试,配合抓包工具看数据

也可以手动新建目录,然后将分区挂载到目录下面,这是挂载lfs分区的例子

void fileinit(void)
{
    struct rt_device *mtd_dev = RT_NULL;

    /* 初始化 fal */
    fal_init();
    /* 生成 mtd 设备 */
    mtd_dev = fal_mtd_nor_device_create(FS_PARTITION1_NAME);
    if (!mtd_dev)
    {
        LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION1_NAME);
    }
    else
    {
        /* 挂载 littlefs */
        if (dfs_mount(FS_PARTITION1_NAME, "/", "lfs", 0, 0) == 0)
        {
            LOG_I("Filesystem initialized!");
            mtd_dev = fal_mtd_nor_device_create(FS_PARTITION2_NAME);
            if (!mtd_dev)
            {
                LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION2_NAME);
            }
            if (opendir("/c") == RT_NULL)
            {
                mkdir("c", 0);
            }
            if (dfs_mount(FS_PARTITION2_NAME, "/c", "lfs", 0, 0) == 0)
            {
                LOG_I("Onchip Filesystem initialized!");
            }

            else
            {
                /* 格式化文件系统 */
                dfs_mkfs("lfs", FS_PARTITION2_NAME);
                if (dfs_mount(FS_PARTITION2_NAME, "/c", "lfs", 0, 0) == 0)
                    LOG_I("Onchip Filesystem initialized!");
                else
                    LOG_E("Onchip Failed to initialize filesystem!");
            }
        }
        else
        {
            /* 格式化文件系统 */
            dfs_mkfs("lfs", FS_PARTITION1_NAME);
            /* 挂载 littlefs */
            if (dfs_mount(FS_PARTITION1_NAME, "/", "lfs", 0, 0) == 0)
            {
                LOG_I("Filesystem initialized!");
            }
            else
            {
                LOG_E("Failed to initialize filesystem!");
            }
        }
    }
}

凡事都是一回生二回熟!缓两天,重新看过来,就发现挺好用的。嘿嘿!

至少要有3个扇区分给littlefs,内部如果是4k一个扇区的话, 就需要12k才行了。我是用stm32f407分了4个128k,但用 df查询容量只能显示2个扇区,即256k。前面的两个扇区littlefs使用了。

发布
问题