/*小内存堆和slab 管理算法*/voidrt_system_heap_init(void* begin_addr,void* end_addr);/*memheap 管理算法*/rt_err_trt_memheap_init(structrt_memheap *memheap,constchar*name,void*start_addr,rt_uint32_tsize) 我在《RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)》板级硬件初始...
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) { unsigned long *lower_csa = NULL; unsigned long *upper_csa = NULL; UpperCtx_Ptr upperCtxPtr = NULL; rt_hw_interrupt_disable(); { __dsync(); /* 使用两个空闲CSA存储线程上层上...
线程挂起可以由多种方法实现:线程调用rt_thread_delay()、rt_thread_suspend()等函数接口可以使得线程主动挂起,放弃CPU使用权,当线程调用rt_sem_take(),rt_mb_recv()等函数时,资源不可使用也会导致调用线程被动挂起。 当线程已经是挂起态的时候无法调用rt_thread_suspend()函数,已经是挂起态的线程调用rt_thread_...
信号量控制块是 RT-Thread 用于管理信号量的一个数据结构,信号量控制块的结构体structrt_semaphore定义如下,rt_sem_t表示信号量的句柄,即指向信号量控制块的指针。 struct rt_semaphore { structrt_ipc_objectparent; /* 继承自 ipc_object 类 */ rt_uint16_t value; /* 信号量的值 */ rt_uint16_t res...
rt_uint8_t rt_thread_ready_table[32];//256位一级位图,代表32个字节,分别对应256个线程优先级。比如第一个字节的bit0表示优先级0,bit7表示优先级7。第二个字节bit0表示优先级8,bit7表示优先级15。 所谓二级位图,即我们首先确定32个字节中最低的非0的字节。为了实现这个效果,我们需要对这32个字节引入一...
/* 初始优先级*/rt_uint32_t number_mask;...rt_ubase_t init_tick;/* 线程初始化计数值*/rt_ubase_t remaining_tick;/* 线程剩余计数值*/struct rt_timer thread_timer;/* 内置线程定时器*/void(*cleanup)(struct rt_thread*tid);/* 线程退出清除函数*/rt_uint32_t user_data;/* 用户数据*/}...
rt_uint16_t critical_lock_nest;/**< critical lock count */#endif/*RT_USING_SMP*//* 优先级 */rt_uint8_t current_priority;/* 当前优先级 */rt_uint8_t init_priority;/* 初始优先级 *//* 如果优先级大于32 */#ifRT_THREAD_PRIORITY_MAX>32rt_uint8_t number;rt_uint8_t high_mask;#...
(void)_thread_exit); #endif /ARCH_CPU_STACK_GROWS_UPWARD */ 也就是针对不同架构的CPU实际传入此函数的参数还存在着不一样的地方! 针对==栈是向下增长型== 的CPU架构,传入的参数为:(rt_uint8_t *)((char *)thread->stack_addr + thread->stack_size - sizeof(rt_ubase_t)) ...
代码清单 6-3 (1):线程栈其实就是一个预先定义好的全局数据,数据类型为rt_uint8_t,大小我们设置为 512。在 RT-Thread 中,凡是涉及到数据类型的地方,RT-Thread 都会将标准的 C 数据类型用 typedef 重新取一个类型名,以“rt”前缀开头。这些经过重定义的数据类型放在 rtdef.h(rtdef.h 第一次使用需要在 ...
根据之前的记录,rt_thread_ready_priority_group 是0x40000000,那么就是第30位最先位1,所以to_thread指针就指向了优先级数组里面第30个元素指向的下一个线程: 然后全局变量 rt_current_thread 也指向这里。 最后,开始调度: rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp); ...