调度方法:时间片轮转。
参考文档:Keil参考手册和rtl.h(任务的每个.c文件都应包含此头文件)头文件这两个文档
1)事件管理:让一个进程等待一个事件,这个事件可以由其它进程和中断触发(只能在中断中使用)。事件不用预先创建(但应先set后wait),wflags与event_flags都是u16类型,每一位代表一个事件,所以每个任务可有16个事件(1~16)。设定单一事件event_flags1<<(n-1),因此可以进行位的与或运算。
os_evt_set(wflags,tmo) isr_evt_set(U16 event_flags, OS_TID task_id) /*触发的2种方法:事务或中断触发*/ os_evt_wait_and(wflags,tmo) /*,tmo表示等待时间*/ os_evt_wait_or(wflags,tmo) /*事件等待的2种方法:逻辑与、或,调用之后会自动清除*/ os_evt_get() os_evt_clr(clr_flags,task_id) (2)邮箱管理:建立一个邮箱,里面可以存放一定数目的消息(比如20条)。进程可以等待邮箱队列,如果邮箱里有消息,则取出,进程继续执行;如果邮箱为空,则继续等待。 os_mbx_declare(mailbox1, num), os_mbx_init(mailbox1, sizeof (mailbox1)); os_mbx_send(mailbox1, msg);, isr_mbx_send() /*发送邮箱的2种方法:进程或中断*/ os_mbx_wait(mailbox1, &msg, 0xffff); /*不在同一个文件中需要进行声明extern OS_MBX mailbox1;*/
发送消息进程必须从动态内存池中分配一个内存块、将消息储存在这个内存块中,然后将它的指针传递给信箱。接收消息进程收到这个指针,取出内存块中的消息,然后释放这个内存块。
固定消息长度发送
RTX核有一个功能强大的固定内存块内存分配函数。它们是线程安全、可重入,且能被RTX核无限制的使用。建议使用固定内存块分配函数发送固定大小的消息。需要为这个消息对象对内存池作适当地初始化。
U32 mpool[邮箱的条数*(2*sizeof(U32))/4 + 3]; /* Reserve a memory for 16 messages */
_init_box (mpool, sizeof(mpool), sizeof(struct message));
发送方:U32 *mptr;
mptr = _alloc_box (mpool); /* Allocate a memory for the message */
mptr[0] = 0x3215fedc; /* Set the message content. */
mptr[1] = 0x00000015;
os_mbx_send (MsgBox, mptr, 0xffff); /* Send a message to a ‘MsgBox’ */
接收方: os_mbx_wait (MsgBox, &rptr, 0xffff); /* Wait for the message to arrive. */
rec_val[0] = rptr[0]; /* Store the content to ‘rec_val’ */
rec_val[1] = rptr[1];
_free_box (mpool, rptr); /* Release the memory block */
变长数据长度信息发送:必须使用可变大小内存块的内存分配函数。 RVCT 库在Stdlib.h文件中提供了这个函数(不可重入)
在malloc()和free()函数执行期间必须禁止系统定时器中断。tsk_lock()函数可禁止定时器中断,而tsk_unlock()函数使能定时器中断。
(3)互斥管理:进程独占的资源,加个锁,别的进程需要等待。 os_mut_init () os_mut_wait() //上锁 os_mut_release() //解锁 (4)信号量管理(计数器型):发送信号量时信号量+1;需求信号量-1(信号量与事件类似,进程等待的信号量大于0时,进程继续执行)。 os_sem_init, os_sem_send, os_sem_wait, isr_sem_send /*发送信号量的2种方法:进程或中断*/
(5)延时: os_dly_wait(),延时的单位:系统节拍。
任务的创建:__tast关键字来修饰函数,一个任务被创建多次即可以有多个实例。
os_tsk_create (xxx_task, 0);
os_tsk_delete_self ();
id1 = os_tsk_self(); /* Obtain own system task identification number */
2个系统任务 os_clock_demon
和 os_idle_demon() /*空闲任务的钩子函数*/
#define OS_PRIVCNT 0 /*RTX内核采用 OS_PRIVCNT 使存储空间的利用最优化*/
#define OS_STKCHECK 1 /*堆栈检查:速度慢但可以指出堆栈有问题的任务ID*/
堆栈大小(用U32):#define OS_STKSIZE 100 /*所以为400字节*/