其他分享
首页 > 其他分享> > 自制国产精简内核 vnRTOS 第 3 节 让内核跑起来

自制国产精简内核 vnRTOS 第 3 节 让内核跑起来

作者:互联网

自制国产实时内核——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 闪烁的功能。

 

标签:task,void,任务,vnRTOS,TASK,sleep,内核,精简,GPIO
来源: https://blog.51cto.com/u_14640655/3023769