RT-Thread Kernel Study Notes-Kernel Object rt_object
RT-Thread Kernel Study Notes-Kernel Object Management
RT-Thread Kernel Study Notes-Kernel Object Operation API
RT-Thread kernel estudo notas - inicialização de objeto kernel organização de lista vinculada
Notas de estudo do kernel RT-Thread - compreensão aprofundada da estrutura da lista vinculada de objetos kernel
Notas de estudo do kernel RT-Thread - compreensão do modelo do dispositivo rt_device
RT-Thread Kernel Study Notes - Compreendendo threads de zumbi extintos
fundo
- Para aprender o objeto kernel, você precisa entender a estrutura de dados básica.
- A maioria das estruturas de dados mais complexas são estruturas de dados do objeto kernel, que são baseadas em estruturas de lista vinculada.
- Precisa de uma compreensão profunda de como os objetos do kernel estão conectados.
Método um do link de lista vinculada
O próximo ponteiro da lista vinculada aponta para o primeiro endereço da próxima estrutura de objeto.
Método dois de link de lista vinculada
O próximo ponteiro da lista vinculada aponta para o próximo membro da lista vinculada da próxima estrutura de objeto.
O endereço de memória de entrada do objeto kernel (primeiro endereço)
- Objeto de kernel RT-Thread, usando o método dois de link de lista vinculada.
- Portanto, o endereço da lista de membros da estrutura do objeto pode ser obtido percorrendo a lista vinculada (o endereço do primeiro próximo membro da lista é o primeiro endereço da própria lista)
- Sabendo o endereço do membro da estrutura, como encontrar o primeiro endereço da própria estrutura?
- A estrutura da estrutura em si não mudará, o tamanho e o tamanho não mudarão, portanto, a posição de cada membro da estrutura é fixa.
- O endereço do membro da estrutura, em relação ao primeiro endereço, o tamanho do deslocamento é fixo.
RT-Thread 使用 : rt_list_entry
/**
* @brief get the struct for this entry
* @param node the entry point
* @param type the type of structure
* @param member the name of list in structure
*/
#define rt_list_entry(node, type, member) \
rt_container_of(node, type, member)
/**
* rt_container_of - return the member address of ptr, if the type of ptr is the
* struct type.
*/
#define rt_container_of(ptr, type, member) \
((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
- Se o primeiro endereço da estrutura for 0, o deslocamento do membro será o endereço da estrutura.
- Supondo que o primeiro endereço da estrutura seja x, o deslocamento do membro é: x + deslocamento.
type a; /* 临时变量,主要为了求成员的偏移 */
/* 成员m 的地址偏移 */
offset = &a.member - &a;
/* 假如已知结构体的某个成员m的地址ptr */
p = ptr - offset; /* ptr - (&a.m - &a) */
- Encontre o deslocamento do membro (deslocamento), você pode obter o endereço da própria estrutura
Resumindo
- Precisa entender profundamente o método de conexão e o método de operação da estrutura da lista vinculada.
- O núcleo RT-Thread fornece uma API de operação de lista vinculada mais rica, que pode ser aprendida e usada.
- Domine a operação da estrutura de dados para estabelecer a base para o estudo subsequente do kernel.