背景学习rt-thread,除了基础的应用,应该花点时间,研究下底层内核的实现方法。rt-thread内核,整体代码量不大,很适合研究,后期,打算在这个基础上,开发一些软件包。之前了解了一点数据结构的知识,主要为结构体、链表。不过感觉没有真正的使用起来。程序 = 数据结构+算法。万事开头难,先从最基本的概念开始。内核对象控制块对象(object)结构体
对象可以派生具体的对象
导火索今天,想仔细看看rt-thread 的内核的对象,基本上都是结构体,看看结构体的大小,占用ram的大小。单片机的程序,短小精悍是每个嵌入式软件工程师追求的,实现相同功能,占用最少资源,意味着硬件成本会进一步降低。编写一个函数,打印一下rt_object 等对象的结构体占用的内存(ram)大小。void print_kernel_object_size(void){ struct rt_object obj; rt_kprintf(struct rt_object size=%d\\n, sizeof(obj)); rt_kprintf(rt_list_t size=%d\\n, sizeof(rt_list_t)); rt_kprintf(struct rt_timer size=%d\\n, sizeof(struct rt_timer)); rt_kprintf(struct rt_thread size=%d\\n, sizeof(struct rt_thread)); rt_kprintf(struct rt_ipc_object size=%d\\n, sizeof(struct rt_ipc_object)); rt_kprintf(struct rt_semaphore size=%d\\n, sizeof(struct rt_semaphore)); rt_kprintf(struct rt_mutex size=%d\\n, sizeof(struct rt_mutex)); rt_kprintf(struct rt_event size=%d\\n, sizeof(struct rt_event)); rt_kprintf(struct rt_mailbox size=%d\\n, sizeof(struct rt_mailbox)); rt_kprintf(struct rt_messagequeue size=%d\\n, sizeof(struct rt_messagequeue)); rt_kprintf(struct rt_mempool size=%d\\n, sizeof(struct rt_mempool)); rt_kprintf(struct rt_device size=%d\\n, sizeof(struct rt_device)); rt_kprintf(struct rt_device_graphic_info size=%d\\n, sizeof(struct rt_device_graphic_info));}msh_cmd_export(print_kernel_object_size, print_kernel_object_size); //导出命令运行效果msh / >priprint_kernel_object_sizemsh / >print_kernel_object_sizestruct rt_object size=20rt_list_t size=8struct rt_timer size=44struct rt_thread size=128struct rt_ipc_object size=28struct rt_semaphore size=32struct rt_mutex size=36struct rt_event size=32struct rt_mailbox size=48struct rt_messagequeue size=60struct rt_mempool size=52struct rt_device size=80struct rt_device_graphic_info size=12struct rt_object size=20,说明:rt_name_max为8时,内核对象大小为:20字节(8+ (4)+8 = 20)初步分析,rt_uint8_t type,rt_uint8_t flag,因为内存对齐,占用了2+2=4个字节。(keil mdk5 armcc)/** * base structure of kernel object */struct rt_object{ char name[rt_name_max]; /**< name of kernel object */ rt_uint8_t type; /**< type of kernel object */ rt_uint8_t flag; /**< flag of kernel object */#ifdef rt_using_module void *module_id; /**< id of application module */#endif rt_list_t list; /** rt_uint32_t type,验证下结构体大小时,却发生了assert 栈溢出。
\\ | /- rt - thread operating system/ | \\ 4.0.3 build jan 16 20212006 - 2020 copyright by rt-thread teamthread: stack overflow经过调试,发现是线程结构体引起的对齐问题。结构体,一定要注意结构与大小一致。线程控制块(结构体)rt_thread,使用了内核对象块,是重写的。
看来,还是不要直接改基础的内核控制块。要改rt_object的结构体大小,其他对象派生的对象,都要注意下。总结通过打印rt_object等结构体的大小,了解了rt_object的基本构成。基本了解到了其他内核对象,如rt_thread(线程控制块),rt_timer(定时器控制块),rt_list_t(双向链表)的ram占用大小。了解到rt_object的派生方式,增加其他对象的特殊属性,构成其他的对象,用链表链接起来,用于os管理。
17个C语言新手编程时常犯的错误及解决方式
新唐科技NUC980DR41YC参数介绍
雷普索尔进军光伏行业,建设126兆瓦太阳能发电厂
全新的超小型整流桥用于LED照明灯具
蓝牙耳机的分类
RT-Thread内核对象控制块详解
PCB走线怎么计算线路宽度
京东方陈炎顺:企业高质量发展的四重逻辑
MIT研究人员正在开发用于物联网的轻型RFID标签
变频驱动器应用于风扇电机到冷却器的能源系统?
MIMXRT1060 FLEXIO UART波特率
5G与AI联手将创造3.9万亿美元价值
电路板上一般什么胶水_电路板封胶用什么胶
2019年欧洲电动汽车投资额达600亿欧元,今明两年市场将迎来爆点
物联网给我们的生活带来了哪些实质性改变?
sessionfactory是什么
华为终端手机产品线总裁何刚宣布,nova星人已经突破了6500万
浅谈函数指针的语法及高级代码示例
格芯正在印度寻找当地伙伴合建芯片工厂
K30 Pro曝光将搭载骁龙865处理器并支持SA/NSA双模5G网络