【事件标志管理函数】
函数名 描述
os_evt_clr 清除至少一个事件标志。
os_evt_get 获取事件标志,使 os_evt_wait_or 运行
os_evt_set 设置至少一个事件标志。
os_evt_wait_and 等待最少所有的事件标志被设置
os_evt_wait_or 等待至少一个事件标志被设置
isr_evt_set 设置至少一个事件标志
注意:
1.使用事件标志管理函数可以释放和等待其他任务的的事件。
【信箱管理函数】
函数名 描述
os_mbx_check 可再加入信箱的消息数
os_mbx_declare 创建信箱对象(被宏定义的)
os_mbx_init 初始化信箱
os_mbx_send 给信箱发送消息
os_mbx_wait 取下一条消息,或在信箱空的情况下等待
isr_mbx_receive 从信箱中取出下一条消息
isr_mbx_send 给信箱发送消息
注意:
1.信息管理函数可以实现通过信箱来进行任务间消息的发送和接收。
【内存分配函数】
函数名 描述
_declare_box 采用4位对齐方式创建固定大小块的内存池
_declare_box8 采用8位对齐方式创建固定大小块的内存池
_init_box 初始化4位对齐的内存池
_init_box8 初始化8位对齐的内存池
_alloc_box (可重入)从内存池中分配一个内存块
_calloc_box (可重入)从内存池中分配一个内存块,并初始化其值为0
_free_box (可重入)回收内存块
注意:
1.内存分配函数通过创建内存池和使用内存池里的固定块来实现对系统内存的动态使用。
2._init_box8, _declare_box和_declare_box8被作为宏来执行。
【互斥量管理函数】
函数名 描述
os_mut_init 初始化互斥量
os_mut_release 释放一个互斥量
os_mut_wait 等待一个互斥量
注意:
1.互斥量管理函数使用互斥量去同步各类任务的行动,以及保护共享变量。
【信号量管理程序】
函数名 描述
os_sem_init 初始化信号量对象
os_sem_send 发送一个信号(标志)给信号量
os_sem_wait 等待来自信号量的信号(标志)
isr_sem_send 发送一个信号(标志)给信号量
注意:
1.信号管理函数使得开发者能使用信号量实现同步各种作业的活动,以保护共享变量。
【系统函数】
函数名 描述
tsk_lock 禁止任务切换
tsk_unlock 使能任务切换
注意:
1.通过系统函数,可以控制定时器中断和任务切换。
【任务管理函数】
函数名 描述
os_sys_init 初始化并启动RL-RTX
os_sys_init_prio 初始化并启动RL-RTX ,指定给开始任务优先级
os_sys_init_user 初始化并启动RL-RTX ,指定给开始任务优先级和自定义栈。
os_tsk_create 创建和启动一个新任务
os_tsk_create_ex 创建、启动以及传递一个参数指针给新任务
os_tsk_create_user 创建、启动以及指定一个自定义栈给新任务
os_tsk_create_user_ex 创建、启动,指定一个自定义栈以及传递一个参数指针给新任务
os_tsk_delete 停止并移除任务
os_tsk_delete_self 停止并移除当前运行任务
os_tsk_pass 传递控制信息给下一个相同优先级的任务
os_tsk_prio 改变任务的优先级
os_tsk_prio_self 改变当前运行任务的优先级
os_tsk_self 获取当前运行任务的ID
注意:
1.通过任务管理函数,可以启动RTX内核,创建和移除各种类型的任务,以及控制任务的运行优先级。
【定时器管理函数】
函数名 描述
os_dly_wait 指定时间间隔内停止调用任务
os_itv_set 使能任务周期性唤醒
os_itv_wait 在任务周期性唤醒时间间隔用完之前停止任务调用
注意:
1.通过定时器管理函数,可以实现任务的停止和重启。
【用户定时器管理函数】
函数名 描述
os_tmr_create 调用函数 os_tmr_call 启动一个减1定时器。
os_tmr_kill 中止一个用户定义计时器。
os_tmr_call 当用户定义计时器时间用完时调用用户自己编写的函数。
注意:
1.当运行用户编写的函数时,通过用户定时器管理程序可以加以控制。
<< 注意事项 >>
在使用RTX内核时候,当遇到运行的问题,以下一些注意事项可能会有帮助:
$ 函数的使用
>> 函数名以os_开始的函数可被进程调用,但是不能被中断服务子程序调用;
>> 函数名以isr_开始的函数可被IRQ中断服务子程序调用,但是不能被进程调用;
>> 在FIQ中断函数中不能调用isr_函数;
>> 在中断函数中不能调用tsk_lock()和 tsk_unlock() 函数;
>> 在RTX内核开始运行前不能使能任何中断。
$ IRQ中断的使用
在使用RTX核时,对IRQ中断的使用无限制。RTX核仅使用一个定时器产生的周期性的时间片来激活任务调度器。
>> IRQ中断会被RTX核禁止很短的一段时间(最长几个微妙);
>> RTX核使用软件中断保护临界代码不被中断;
>> 0-7号软件中断被RTL-RTX核使用,不能被用户程序使用;
>> RTX使用系统自带的SWI处理器(自动地从函数库中链接),用户在工程中不能创建自己的SWI处理器。移除用户自建的SWI处理器以解决数据中止。
>> 若在应用程序中出现一些零星问题,可以检查在启动代码中配置的IRQ栈的大小。IRQ栈的使用依赖中断函数的复杂性。
$ FIQ中断的使用
快速中断是不能被RTX核使用的,但是可以在应用程序中自由的使用FIQ中断。
>> RTX核不禁止FIQ中断的使用。
>> 在FIQ中断处理函数中不能调用任何RTX核的系统函数。
$ 系统的启动代码
RTX核为每一个进程设置独立的栈,栈的大小在配置文件配置。但在RTX核通过os_sys_init()函数启动以前,系统使用的是在启动文件STARTUP.S中为用户模式配置的栈。当RTX核启动并运行以后,用户模式的栈将不会再被使用,也就是浪费存储空间,因此建议在启动文件中将栈的容量尽量设置为最小。
在启动代码STARTUP.S中为RTX核配置的最小栈容量为:
管理模式下为32字节(0x00000020);
中断模式下为64字节(0x00000040);
用户模式下为80字节(0x00000050);
当调用 SWI 函数时系统使用的是管理模式栈。如果使用复杂的__swi函数,必须增加栈的容量。
中断模式栈使用在时间片中断时,这个中断激活os_clock_demon()任务调度器,它拥有自己的栈且运行在用户模式。如果在用户程序中使用中断,必须增加这个栈的大小。开始时256字节大小的栈是一个不错的选择,但如果中断模式的栈溢出后,应用程序运行异常甚至崩溃。
用户模式栈在RTX核启动以前使用。建议在通过os_sys_init()函数创造和开始的第一个进程中初始化用户应用程序。
在调用os_sys_init()函数以前,可以配置端口引脚、使能AD转换器等。函数init_IO必须很小且不能使用很多的局部变量,以避免用户模式栈会溢出。
void main (void) {
/* Here a simple IO may be initialized. */
init_IO ();
os_sys_init (task1);
for (;;);
}
建议在第一个进程中做复杂的初始化工作。因此在这进程中,栈可比通常其他用户模式栈的容量大。
void task1 (void) __task {
/* Here the interrupts and more complex IO may be initialized. */
Init_CAN ();
...
}
函数名 描述
os_evt_clr 清除至少一个事件标志。
os_evt_get 获取事件标志,使 os_evt_wait_or 运行
os_evt_set 设置至少一个事件标志。
os_evt_wait_and 等待最少所有的事件标志被设置
os_evt_wait_or 等待至少一个事件标志被设置
isr_evt_set 设置至少一个事件标志
注意:
1.使用事件标志管理函数可以释放和等待其他任务的的事件。
【信箱管理函数】
函数名 描述
os_mbx_check 可再加入信箱的消息数
os_mbx_declare 创建信箱对象(被宏定义的)
os_mbx_init 初始化信箱
os_mbx_send 给信箱发送消息
os_mbx_wait 取下一条消息,或在信箱空的情况下等待
isr_mbx_receive 从信箱中取出下一条消息
isr_mbx_send 给信箱发送消息
注意:
1.信息管理函数可以实现通过信箱来进行任务间消息的发送和接收。
【内存分配函数】
函数名 描述
_declare_box 采用4位对齐方式创建固定大小块的内存池
_declare_box8 采用8位对齐方式创建固定大小块的内存池
_init_box 初始化4位对齐的内存池
_init_box8 初始化8位对齐的内存池
_alloc_box (可重入)从内存池中分配一个内存块
_calloc_box (可重入)从内存池中分配一个内存块,并初始化其值为0
_free_box (可重入)回收内存块
注意:
1.内存分配函数通过创建内存池和使用内存池里的固定块来实现对系统内存的动态使用。
2._init_box8, _declare_box和_declare_box8被作为宏来执行。
【互斥量管理函数】
函数名 描述
os_mut_init 初始化互斥量
os_mut_release 释放一个互斥量
os_mut_wait 等待一个互斥量
注意:
1.互斥量管理函数使用互斥量去同步各类任务的行动,以及保护共享变量。
【信号量管理程序】
函数名 描述
os_sem_init 初始化信号量对象
os_sem_send 发送一个信号(标志)给信号量
os_sem_wait 等待来自信号量的信号(标志)
isr_sem_send 发送一个信号(标志)给信号量
注意:
1.信号管理函数使得开发者能使用信号量实现同步各种作业的活动,以保护共享变量。
【系统函数】
函数名 描述
tsk_lock 禁止任务切换
tsk_unlock 使能任务切换
注意:
1.通过系统函数,可以控制定时器中断和任务切换。
【任务管理函数】
函数名 描述
os_sys_init 初始化并启动RL-RTX
os_sys_init_prio 初始化并启动RL-RTX ,指定给开始任务优先级
os_sys_init_user 初始化并启动RL-RTX ,指定给开始任务优先级和自定义栈。
os_tsk_create 创建和启动一个新任务
os_tsk_create_ex 创建、启动以及传递一个参数指针给新任务
os_tsk_create_user 创建、启动以及指定一个自定义栈给新任务
os_tsk_create_user_ex 创建、启动,指定一个自定义栈以及传递一个参数指针给新任务
os_tsk_delete 停止并移除任务
os_tsk_delete_self 停止并移除当前运行任务
os_tsk_pass 传递控制信息给下一个相同优先级的任务
os_tsk_prio 改变任务的优先级
os_tsk_prio_self 改变当前运行任务的优先级
os_tsk_self 获取当前运行任务的ID
注意:
1.通过任务管理函数,可以启动RTX内核,创建和移除各种类型的任务,以及控制任务的运行优先级。
【定时器管理函数】
函数名 描述
os_dly_wait 指定时间间隔内停止调用任务
os_itv_set 使能任务周期性唤醒
os_itv_wait 在任务周期性唤醒时间间隔用完之前停止任务调用
注意:
1.通过定时器管理函数,可以实现任务的停止和重启。
【用户定时器管理函数】
函数名 描述
os_tmr_create 调用函数 os_tmr_call 启动一个减1定时器。
os_tmr_kill 中止一个用户定义计时器。
os_tmr_call 当用户定义计时器时间用完时调用用户自己编写的函数。
注意:
1.当运行用户编写的函数时,通过用户定时器管理程序可以加以控制。
<< 注意事项 >>
在使用RTX内核时候,当遇到运行的问题,以下一些注意事项可能会有帮助:
$ 函数的使用
>> 函数名以os_开始的函数可被进程调用,但是不能被中断服务子程序调用;
>> 函数名以isr_开始的函数可被IRQ中断服务子程序调用,但是不能被进程调用;
>> 在FIQ中断函数中不能调用isr_函数;
>> 在中断函数中不能调用tsk_lock()和 tsk_unlock() 函数;
>> 在RTX内核开始运行前不能使能任何中断。
$ IRQ中断的使用
在使用RTX核时,对IRQ中断的使用无限制。RTX核仅使用一个定时器产生的周期性的时间片来激活任务调度器。
>> IRQ中断会被RTX核禁止很短的一段时间(最长几个微妙);
>> RTX核使用软件中断保护临界代码不被中断;
>> 0-7号软件中断被RTL-RTX核使用,不能被用户程序使用;
>> RTX使用系统自带的SWI处理器(自动地从函数库中链接),用户在工程中不能创建自己的SWI处理器。移除用户自建的SWI处理器以解决数据中止。
>> 若在应用程序中出现一些零星问题,可以检查在启动代码中配置的IRQ栈的大小。IRQ栈的使用依赖中断函数的复杂性。
$ FIQ中断的使用
快速中断是不能被RTX核使用的,但是可以在应用程序中自由的使用FIQ中断。
>> RTX核不禁止FIQ中断的使用。
>> 在FIQ中断处理函数中不能调用任何RTX核的系统函数。
$ 系统的启动代码
RTX核为每一个进程设置独立的栈,栈的大小在配置文件配置。但在RTX核通过os_sys_init()函数启动以前,系统使用的是在启动文件STARTUP.S中为用户模式配置的栈。当RTX核启动并运行以后,用户模式的栈将不会再被使用,也就是浪费存储空间,因此建议在启动文件中将栈的容量尽量设置为最小。
在启动代码STARTUP.S中为RTX核配置的最小栈容量为:
管理模式下为32字节(0x00000020);
中断模式下为64字节(0x00000040);
用户模式下为80字节(0x00000050);
当调用 SWI 函数时系统使用的是管理模式栈。如果使用复杂的__swi函数,必须增加栈的容量。
中断模式栈使用在时间片中断时,这个中断激活os_clock_demon()任务调度器,它拥有自己的栈且运行在用户模式。如果在用户程序中使用中断,必须增加这个栈的大小。开始时256字节大小的栈是一个不错的选择,但如果中断模式的栈溢出后,应用程序运行异常甚至崩溃。
用户模式栈在RTX核启动以前使用。建议在通过os_sys_init()函数创造和开始的第一个进程中初始化用户应用程序。
在调用os_sys_init()函数以前,可以配置端口引脚、使能AD转换器等。函数init_IO必须很小且不能使用很多的局部变量,以避免用户模式栈会溢出。
void main (void) {
/* Here a simple IO may be initialized. */
init_IO ();
os_sys_init (task1);
for (;;);
}
建议在第一个进程中做复杂的初始化工作。因此在这进程中,栈可比通常其他用户模式栈的容量大。
void task1 (void) __task {
/* Here the interrupts and more complex IO may be initialized. */
Init_CAN ();
...
}