跳至主要內容
hero image

马龙伟的博客

关于我
关于我
嵌入式工程师
关于本站
这里有关于站点的详细介绍
小白教程
从零搭建博客网站
学习笔记
我的学习笔记
agile 全家桶
轻量级软件包
RT-Thread
RT-Thread
小而美的物联网操作系统
博客模板
博客模板
vuepress-theme-hope
RT-Thread 各版本问题整理

RT-Thread 4.1.0

SD 驱动框架

SD 初始化失败移除 blk_dev 时存在双向链表 nextprev 都为 NULL 的情况,造成死循环。

修改 rt_mmcsd_blk_remove:

void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card)
{
    rt_list_t *l, *n;
    struct mmcsd_blk_device *blk_dev;

+     if(card == RT_NULL)
+     {
+         LOG_E("card is null!");
+         return;
+     }
+
+     if(rt_list_isempty(&card->blk_devices))
+     {
+         LOG_E("card blk_devices is empty!");
+         return;
+     }
+
+     if ((&card->blk_devices)->next == RT_NULL)
+     {
+         LOG_E("card blk_devices is null!");
+         return;
+     }

    for (l = (&card->blk_devices)->next, n = l->next; l != &card->blk_devices; l = n, n=n->next)
    {
        blk_dev = (struct mmcsd_blk_device *)rt_list_entry(l, struct mmcsd_blk_device, list);
        if (blk_dev->card == card)
        {
            /* unmount file system */
            const char * mounted_path = dfs_filesystem_get_mounted_path(&(blk_dev->dev));
            if (mounted_path)
            {
                  dfs_unmount(mounted_path);
                  LOG_D("unmount file system %s for device %s.\r\n", mounted_path, blk_dev->dev.parent.name);
            }
            rt_sem_delete(blk_dev->part.lock);
            rt_device_unregister(&blk_dev->dev);
            rt_list_remove(&blk_dev->list);
            rt_free(blk_dev);
        }
    }
}

马龙伟...大约 1 分钟笔记RT-Thread
杂项

uint32 int32 -1 相等判断

#define RT_WAITING_FOREVER -1

int main(int argc, char *argv[]) {
    uint32_t timeout = 0;
    timeout = -1;

    if (timeout == RT_WAITING_FOREVER) {
        printf("==\r\n");
    } else {
        printf("!=\r\n");
    }

    return 0;
}

马龙伟...小于 1 分钟笔记C/C++
RT-Thread 裁剪分析

Nano 实践

官方文档数据

资源占用小: 对 RAM 与 ROM 的开销非常小,在支持 semaphore 和 mailbox 特性,并运行两个线程 (main 线程 + idle 线程) 情况下,ROM 和 RAM 依然保持着极小的尺寸,RAM 占用约 1K 左右,ROM 占用 4K 左右。

Nano 资源占用情况举例:在运行两个线程 (main 线程 + idle 线程) 情况下,ROM 和 RAM 依然保持着极小的尺寸。以下是基于 Cortex M3 的 MDK 工程编译结果(优化等级 3)。

    Total RO  Size (Code + RO Data)                 4000 (   3.91kB)
    Total RW  Size (RW Data + ZI Data)              1168 (   1.14kB)
    Total ROM Size (Code + RO Data + RW Data)       4092 (   4.00kB)

马龙伟...大约 4 分钟笔记RT-Thread
柔性数组

参考链接

C语言中的柔性数组 C语言结构体中char[0]和char[1]的用法

实现机制

在结构体最后加 char[0]char[1] 的用法是GNU C的扩展,在ISO/IEC 9899-1999里面,这么写是非法的。

这种用法在C99中叫做 柔性数组。柔性数组成员前面必须至少有一个其它类型成员。包含柔性数组成员的结构要用malloc进行动态内存分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。


马龙伟...大约 3 分钟笔记C/C++
2
3