自制国产实时内核——vnRTOS 所有文档: vnRTOS 文档
首先我们看下如何使用:
main函数部分:
core_init();
led1_id = task_create(led1_task, (void *)0, 10 * TASK_STACK_40_BYTE, USER_PRIO_BASE, "led1");
led2_id = task_create(led2_task, (void *)0, 10 * TASK_STACK_40_BYTE, USER_PRIO_BASE, "led2");
core_start();
使用很简单,首先调用 core_init ,它负责内核的初始化工作,主要是创建 几个系统级的任务,同时初始化好内存分配等功能
然后我们使用 task_create 来创建任务
函数的参数说明:
/***************************************************************
功能: 创建一个任务
参数: void (*task_fun)(void *pd) 任务的代码
void *pdata 传递给任务的参数
INT32U size 任务的栈的大小,单位是 TASK_STACK_SIZE 字节
具体任务栈的大小,要考虑具体任务,而且
该大小没有考虑到栈的头部也需要存储信息
对于 Cortex-M3 内核而言,头部还要保持
16 个寄存器的数据 ,也就是 16*4 = 64字节的头部
那么 size 的最小值
INT8U prio 任务优先级
INT32U runtime 任务的时间片
INT8U* name 任务的名字
返回值 0 创建失败
其他值 任务的 ID 号
****************************************************************/
INT32U task_create(void (*task_fun)(void *pd), void *pdata, INT32U size, INT8U prio, INT8U* name)
关于优先级的,一般建议使用 USER_PRIO_BASE 的优先级,也就是 10 。数值越 小,优先级越 高。
接下来我们就可以愉快的写我们的的任务了:
void led1_task(void *p)
{
volatile INT32U i;
LED_Init();
for(;;)
{
//task_change_prio(TASK_SELF, 25);
for(i = 0; i < 2; i++)
{
GPIO_WriteBit(GPIOE, GPIO_Pin_3, Bit_SET);
task_sleep(100); //delay(1000); //task_sleep(100);
GPIO_WriteBit(GPIOE, GPIO_Pin_3, Bit_RESET);
task_sleep(200); //task_sleep(100);
}
}
}
void led2_task(void *p)
{
int i;
LED_Init();
for(;;)
{
//task_change_prio(TASK_SELF, 20);
for(i = 0; i < 2; i++)
{
GPIO_WriteBit(GPIOE, GPIO_Pin_4, Bit_SET);
task_sleep(300); //task_sleep(100); //
GPIO_WriteBit(GPIOE, GPIO_Pin_4, Bit_RESET);
task_sleep(200); //delay(1000); //
}
}
}
事实上它就是两个 led 闪烁的功能。