线程挂起可以由多种方法实现:线程调用rt_thread_delay()、rt_thread_suspend()等函数接口可以使得线程主动挂起,放弃CPU使用权,当线程调用rt_sem_take(),rt_mb_recv()等函数时,资源不可使用也会导致调用线程被动挂起。 当线程已经是挂起态的时候无法调用rt_thread_suspend()函数,已经是挂起态的线程调用rt_thread_...
要理解 RT-Thread 内存堆管理,首先得知道它管理的是哪一块内存,所以得知道 RT-Thread 内存分配。 其实细心的朋友会发现,我在前面文章《RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)》 中提到过 RT-Thread 内存分配情况,在其中的2.2.2 RT-Thread 堆和栈空间说明(与FreeRTOS不同)有过说明:...
AI代码解释 void*rt_malloc(rt_size_t size){rt_size_t ptr,ptr2;struct heap_mem*mem,*mem2;if(size==0)returnRT_NULL;RT_DEBUG_NOT_IN_INTERRUPT;/*按四字节对齐申请,如申请5字节,则实际按8字节申请*/if(size!=RT_ALIGN(size,RT_ALIGN_SIZE))RT_DEBUG_LOG(RT_DEBUG_MEM,("malloc size...
rt_err_t rt_mutex_init (rt_mutex_t mutex, const char* name, rt_uint8_t flag) 该函数对参数mutex指定的互斥量控制块进行初始化。另外两个参数name和flag与动态创建函数相同。 2. 获取互斥量 RT-thread 提供的获取互斥量的函数接口如下,线程通过调用此函数来获取某个互斥量。 rt_err_t rt_mutex_take...
#include <rtthread.h>#include<rthw.h>#defineIDLE_THREAD_STACK_SIZE 512ALIGN(RT_ALIGN_SIZE)staticrt_uint8_t rt_thread_stack[IDLE_THREAD_STACK_SIZE]; 空闲线程的栈是一个定义好的数组,大小由IDLE_THREAD_STACK_SIZE 这个宏控制,默认为512,即128个字。
/* 初始优先级*/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_sem_t rt_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag) 1. 2. 3. 当调用这个函数时,系统将先从对象管理器中分配一个 semaphore 对象,并初始化这个对象,然后初始化父类IPC对象以及与semaphore相关的部分。 该函数的各个参数解释如下: ...
(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)) ...
根据之前的记录,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); ...
rt_sem_trt_sem_create(constchar*name,(1)rt_uint32_tvalue,(2)rt_uint8_tflag)(3){rt_sem_tsem;RT_DEBUG_NOT_IN_INTERRUPT;/* 分配内核对象 */sem=(rt_sem_t)rt_object_allocate(RT_Object_Class_Semaphore,name);if(sem==RT_NULL)(4)returnsem;/* 初始化信号量对象 */rt_ipc_object_init...