RT-Thread 內核學習筆記 - 內核對象操做API

RT-Thread 內核學習筆記 - 內核對象rt_objectshell

RT-Thread 內核學習筆記 - 內核對象管理函數

RT-Thread 內核學習筆記 - 內核對象操做API學習

RT-Thread 內核學習筆記 - 內核對象初始化鏈表組織方式測試

RT-Thread 內核學習筆記 - 內核對象鏈表結構深刻理解ui

RT-Thread 內核學習筆記 - 設備模型rt_device的理解操作系統

RT-Thread 內核學習筆記 - 理解defunct殭屍線程
背景線程

目的仍是學習並熟悉RT-Thread 操做系統。
從最簡單的對象管理切入
瞭解操做系統最基本的組成單位:Object

內核對象API3d

內核對象的主要操做方法:內核文件:object.c中實現指針

2021-01-24_215832.png
知識點code

查看內核文件:object.c,發現的主要的幾個知識點

2021-01-24_215932.png
驗證與測試

光看內核代碼,不如敲一敲(抄一下)。
能夠使用模擬器,寫幾個測試函數,看看對象操做的流程。

測試用例以下:

/ RT-Thread 內核對象學習 /

include <rtthread.h>

struct _obj_type
{

enum rt_object_class_type type;
const char* name;

};

/ 靜態的對象定義 /
static struct rt_object _obj[] = { 0 };

/ 測試用,線程對象 /
static const struct _obj_type _obj_tbl[] =
{

{ RT_Object_Class_Thread, "th_01" },
{ RT_Object_Class_Thread, "th_02" },
{ RT_Object_Class_Thread, "th_03" },
{ RT_Object_Class_Thread, "th_04" },
{ RT_Object_Class_Thread, "th_05" },

};

define OBJ_TEST_TBL_SIZE (sizeof(_obj_tbl) / sizeof(_obj_tbl[0]))

/ 靜態初始化對象 /
void obj_test_init(void)
{

rt_uint8_t index = 0;
rt_uint8_t obj_size = 0;

for (index = 0; index < OBJ_TEST_TBL_SIZE; index++)
{
    rt_object_init(&_obj[index], _obj_tbl[index].type, _obj_tbl[index].name);
}

}

/ 動態建立對象 obj_test_create thread1 /
void obj_test_create(uint8_t argc, char** argv)
{

struct rt_object* obj = RT_NULL;

if (argc >= 2)
{
    rt_kprintf(" obj_name=%s\n", argv[1]);
}

obj = rt_object_find(argv[1], RT_Object_Class_Thread);
if (obj != RT_NULL)
{
    rt_kprintf("obj_name=%s, exist!!\n", obj->name);
    return;
}
else
{
    rt_object_allocate(RT_Object_Class_Thread, argv[1]);
    rt_kprintf("create obj_name=%s\n", argv[1]);
}

}

/ 對象的打印 /
void obj_test_dump(void)
{

rt_uint8_t index = 0;
rt_uint8_t obj_size = 0;
struct rt_object* obj_pointers[OBJ_TEST_TBL_SIZE + 10] = { 0 };

obj_size = rt_object_get_pointers(RT_Object_Class_Thread, obj_pointers, sizeof(obj_pointers));
rt_kprintf("object init : object size=%d\n", obj_size);

rt_kprintf("| index |     name     |  flag  |  type  |\n");
rt_kprintf("+-------+--------------+--------+--------+\n");
for (index = 0; index < obj_size; index++)
{
    if (obj_pointers[index] == RT_NULL)
    {
        break;
    }
    rt_kprintf("|  %03d  |  %10s  |   %02d   |  0x%02x  |\n", index,
        obj_pointers[index]->name, obj_pointers[index]->flag,
        obj_pointers[index]->type);
}
rt_kprintf("+-------+--------------+--------+--------+\n");

}

/ 查找線程對象 /
void obj_test_find(uint8_t argc, char** argv)
{

struct rt_object* obj = RT_NULL;

if (argc >= 2)
{
    rt_kprintf(" obj_name=%s\n", argv[1]);
}

obj = rt_object_find(argv[1], RT_Object_Class_Thread);
if (obj != RT_NULL)
{
    rt_kprintf("find obj_name=%s\n", obj->name);
}
else
{
    rt_kprintf("not find obj_name=%s\n", argv[1]);
}

}

/ 靜態對象 detach /
void obj_test_detach(uint8_t argc, char** argv)
{

struct rt_object* obj = RT_NULL;

if (argc >= 2)
{
    rt_kprintf(" obj_name=%s\n", argv[1]);
}

obj = rt_object_find(argv[1], RT_Object_Class_Thread);
if (obj != RT_NULL)
{
    rt_kprintf("find obj_name=%s\n", obj->name);
    rt_object_detach(obj);
    rt_kprintf("detach obj_name=%s\n", obj->name);
}
else
{
    rt_kprintf("not find obj_name=%s\n", argv[1]);
}

}

/ 動態對象 delete /
void obj_test_delete(uint8_t argc, char** argv)
{

struct rt_object* obj = RT_NULL;

if (argc >= 2)
{
    rt_kprintf(" obj_name=%s\n", argv[1]);
}

obj = rt_object_find(argv[1], RT_Object_Class_Thread);
if (obj != RT_NULL)
{
    rt_kprintf("find obj_name=%s\n", obj->name);
    rt_object_delete(obj);
    rt_kprintf("delete obj_name=%s\n", obj->name);
}
else
{
    rt_kprintf("not find obj_name=%s\n", argv[1]);
}

}

/ 導出命令 /
MSH_CMD_EXPORT(obj_test_init, object init test);
MSH_CMD_EXPORT(obj_test_create, obj create test);
MSH_CMD_EXPORT(obj_test_dump, object test dump);
MSH_CMD_EXPORT(obj_test_find, object test find);
MSH_CMD_EXPORT(obj_test_detach, object test detach);
MSH_CMD_EXPORT(obj_test_delete, object test del);

學習總結
總結一

發現:tshell 是動態建立的線程
發現:tidle 是靜態的線程

msh />obj_test_dump
object init : object size=2

index name flag type
000 tshell 00 0x01
001 tidle0 00 0x81

msh />

總結二

動態對象,建立後,內存佔用增長。
動態對象,刪除後,內存佔用恢復

msh />free
total memory: 8388580
used memory : 5164 / 【5164】 內存原有大小 /
maximum allocated memory: 7336
msh />
msh />obj
obj_test_init
obj_test_create
obj_test_dump
obj_test_find
obj_test_detach
obj_test_delete
msh />obj_test_cre
obj_test_create
msh />obj_test_create hello
obj_name=hello
create obj_name=hello
msh />
msh />fre
free
msh />free
total memory: 8388580
used memory : 5304 / 【5304】 內存佔用 /
maximum allocated memory: 7336
msh />
msh />obj_test_delete hello
obj_name=hello
find obj_name=hello
delete obj_name=hello
msh />free
total memory: 8388580
used memory : 5164 / 【5304】,內存佔用恢復 /
maximum allocated memory: 7336
msh />

總結三

靜態初始化的對象,detach(剔除對象管理)後,內存佔用不變。

msh />obj_test_init
msh />ob
obj_test_init
obj_test_create
obj_test_dump
obj_test_find
obj_test_detach
obj_test_delete
msh />obj_test_du
obj_test_dump
msh />obj_test_dump
object init : object size=7

index name flag type
000 th_05 00 0x81
001 th_04 00 0x81
002 th_03 00 0x81
003 th_02 00 0x81
004 th_01 00 0x81
005 tshell 00 0x01
006 tidle0 00 0x81

msh />free
total memory: 8388580
used memory : 5164
maximum allocated memory: 7336
msh />
msh />obj
obj_test_init
obj_test_create
obj_test_dump
obj_test_find
obj_test_detach
obj_test_delete
msh />obj_test_deta
obj_test_detach
msh />obj_test_detach th_04
obj_name=th_04
find obj_name=th_04
detach obj_name=th_04
msh />obj_test_du
obj_test_dump
msh />obj_test_dump
object init : object size=6

index name flag type
000 th_05 00 0x81
001 th_03 00 0x81
002 th_02 00 0x81
003 th_01 00 0x81
004 tshell 00 0x01
005 tidle0 00 0x81

msh />
msh />free
total memory: 8388580
used memory : 5164
maximum allocated memory: 7336

總結

RT-Thread 內核對象的管理並不複雜
相關的知識點,如鏈表的初始化、插入、遍歷、經過鏈表指針獲取對象指針等比較的重要。
掌握好內核對象的基本操做,爲後面學習派生對象如:線程對象、設備對象等,打下基礎。

原文連接:https://club.rt-thread.org/as...

相關文章
相關標籤/搜索