本文共 6734 字,大约阅读时间需要 22 分钟。
新版本的RT-Thread Studio 不需要再复位了
rt_config.c
中的RT_TICK_PER_SECOND
设置。【1000 表示 1000Hz,即1ms】rt_thread_delay()、rt_sem_take()
等可能会导致线程挂起的阻塞类函数。①、禁止调度(调度器上锁)
...rt_enter_critical();//调度器上锁,上锁后不再切换到其他线程,仅响应中断//进入临界区rt_exit_critical();//调度器解锁...
②、关闭中断【因为所有线程的调度都是建立在中断的基础上的】
rt_base_t level;...level = rt_hw_interrupt_disable();//关闭中断//以下临界区rt_hw_interrupt_enable(level);//打开中断...
线程的大小是在栈(STACK)中分配的
线程的各个状态转换图:
OS TICK
为单位,并且可以定时的是系统节拍的整数倍】 RT_TIMER_FLAG_ONE_SHOT
- 一次性运行RT_TIMER_FLAG_PERIODIC
- 周期运行RT_USING_TIMER_SOFT
这个宏!RT_TIMER_FLAG_HARD_TIMER
- HARD模式【中断】【默认】RT_TIMER_FLAG_SOFT_TIMER
- SOFT模式【线程】struct rt_semaphore{ struct rt_ipc_object parent; /**< inherit from ipc_object */ rt_uint16_t value; /**< value of semaphore. */};typedef struct rt_semaphore *rt_sem_t;
定义静态信号量:struct rt_semaphore static_sem
定义动态信号量:rt_sem_t dynamic_sem
信号量操作函数
初始化与脱离【针对静态信号量】
创建与删除【针对动态信号量】 【注意动态的会有成功和失败,所以一定要判断】
flag
取值为RT_IPC_FLAG_FIFO
和RT_IPC_FLAG_PRIO
两种,前者表示先进先出排队,后者便是优先级排队。 获取动态信号量(信号量值-1)
time=0
表示此时立即返回,time=50
表示等待50ms后返回,time=RT_WAITING_FOREVER
表示永久等待!rt_sem_trytake
是rt_sem_take
中time=0的情况。等不到信号量时,两者都会返回RT_ETimeout
,当成功返回信号量,返回RT_OK
释放信号量(信号量值+1)
释放完信号量后,信号量值+1
注意:释放信号量,可以在线程或者中断中!
rt_config.h
中的RT_THREAD_PRIORITY_MAX
来修改最大支持的优先级struct rt_mutex{ struct rt_ipc_object parent; /**< inherit from ipc_object */ rt_uint16_t value; /**< value of mutex */ rt_uint8_t original_priority; /**< priority of last thread hold the mutex */ rt_uint8_t hold; /**< numbers of thread hold the mutex */ struct rt_thread *owner; /**< current owner of mutex */};typedef struct rt_mutex *rt_mutex_t;
定义静态互斥量struct rt_mutex static_mutex
定义动态互斥量rt_mutex_t dynamic_mutex
互斥量操作函数
初始化与脱离【针对静态信号量】
flag
表示当互斥量不可用的时候,等待线程的排队方式FIFO
或者PRIO
创建与删除【动态】
获取互斥量【对互斥量的加锁操作】
time
表示等待被加锁时间hold
将会实现+1操作!释放互斥量
struct rt_mailbox{ struct rt_ipc_object parent; /**< inherit from ipc_object */ rt_uint32_t *msg_pool; /**< start address of message buffer */ rt_uint16_t size; /**< size of message pool */ rt_uint16_t entry; /**< index of messages in msg_pool */ rt_uint16_t in_offset; /**< input offset of the message buffer */ rt_uint16_t out_offset; /**< output offset of the message buffer */ rt_list_t suspend_sender_thread; /**< sender thread suspended on this mailbox */};typedef struct rt_mailbox *rt_mailbox_t;
定义静态邮箱:struct rt_mailbox staic_mb
定义动态邮箱:rt_mailbox_t dynamic_mb
邮箱操作函数
rt_mb_send_wait
邮件发送函数,在timeout
内邮箱是满的,可以等待。若超过timeout仍然是满的,则会发送超时。rt_mb_send
可以在线程或中断中使用,而 rt_mb_send_wait
只能在线程中使用。msg_size
表示消息的长度,但是会根据系统中的字节对齐自动调整,比如系统的字节对齐为4,【rtconfig.h
中定义的RT_ALIGN_SIZE
】,若msg_size
赋值为1,则系统会自动改为4;若msg_size
赋值为5,则系统会自动改为8…max_msgs
表示消息队里的消息个数,若内存池大小1024,那么max_msgs
的计算方法为1024/(4+4)=128
。第一个4为系统的字节对齐长度,第二个字节长度为系统指针占的字节数! 以乘公交车为例说明事件集
信号量主要用于“一对一”的线程同步,当需要“一对多”、“多对一”、“多对多”的同步时,就需要事件集来处理了。
RT-Thread中的事件集用一个32位无符号整型变量来表示,变量中的一个位代表一个事件,线程通过“逻辑与”或“逻辑或”与一个或多个事件简历关联形成一个事件组合。
看图解释上述:线程或者中断发送一个32位无符号整型变量表示的事件集,分别为事件0~事件31,而线程1只对其中的事件1或者事件30感兴趣,只要事件1和事件30满足逻辑于或者逻辑或的关系即可满足条件。
事件集控制块
struct rt_event{ struct rt_ipc_object parent; /**< inherit from ipc_object */ rt_uint32_t set; /**< event set */};typedef struct rt_event *rt_event_t;
定义静态事件集:struct rt_event static_evt
定义动态事件集:rt_event_t dynamic_evt
事件集操作函数
初始化和脱离【针对静态事件集】
创建和删除【针对动态事件集】
发送事件【注意:线程或者中断都可以发送】
接收事件
0x01 | 0x08
,表示对第0个和第3个事件感兴趣。msg_size
,会根据系统对齐字节数,进行自动调整!假如内存大小为4096,block_size=80,那么会有4096/(80+4)=48个内存块!转载地址:http://uynaf.baihongyu.com/