单片机移植-UCOS移植-(函数详解)

嵌入式移植-UCOS移植-(函数详解)

1.系统滴答定时器SysTick

// 这是stm32flx系列官网下载的程序源码,每一个芯片系列的Systick配置是不一样的,需要根据要求自己设置或修改。
static void SysTickConfig(void)
{
	uint16_t time=0;
	//time = SystemCoreClock / 1000;
  time = 10000;
  if (SysTick_Config(time))//--10000 - 1ms ,
  {
    while (1);
  }
  /* Configure the SysTick handler priority */
  NVIC_SetPriority(SysTick_IRQn, 0x0);
}
//定时器中断, 1ms中断一次
void SysTick_Handler(void)
{
  TimingDelay_Decrement();
}

void TimingDelay_Decrement(void)
{
/*
OSIntEnter() - 对全局变量OSIntNesting增1,OSIntNesting为中断嵌套深度 - 进入中断

OSTimeTick() - 在时钟节拍到来时,检查每个任务的任务控制块中 OSTCBDly-1 后是否为0,如果为0 则刚才此任务为挂起状态,现在应该为就绪状态。

OSIntExit() -对OSIntNesting减1,刚好与OSIntEnter() 相对应。

*/
	if(OSRunning)//OS已经在运行了
	{
		 OSIntEnter();
		 OSTimeTick();
		 OSIntExit();
	}
}

2.任务的创建与启动任务
在这里插入图片描述

INT8U  OSTaskCreate(void (*task)(void *p_arg),//任务代码的地址
                                      void *p_arg,//任务参数
                                       OS_STK *ptos,//任务堆栈栈顶指针
                                        INT8U prio)//任务的优先级
{
...
}
//启动任务,第一个任务
//-中断优先级LED2_TASK_PRIO的值越大,优先级越低;反之,值越小,优先级越大。
void start_task(void *pdata)    
{
	OS_CPU_SR cpu_sr=0;
	pdata=pdata;
	
	OSStatInit();  //初始化统计任务
	OS_ENTER_CRITICAL();  //进入临界区,中断无法打断--原子操作
	OSTaskCreate(led1_task,(void *)0,(OS_STK *)&LED1_TASK_STK[LED1_STK_SIZE-1]
	,LED1_TASK_PRIO);
	OSTaskCreate(led2_task,(void *)0,(OS_STK *)&LED2_TASK_STK[LED2_STK_SIZE-1]
	,LED2_TASK_PRIO);
	OSTaskCreate(led3_task,(void *)0,(OS_STK *)&LED3_TASK_STK[LED3_STK_SIZE-1]
	,LED3_TASK_PRIO);
	OSTaskSuspend(START_TASK_PRIO);   //挂起起始任务
	OS_EXIT_CRITICAL();  //退出临界区,中断可以打断
}
OS_STAT_RDY       表示任务处于就绪状态
OS_STAT_SEM       表示任务处于等待信号量状态
OS_STAT_MBOX     表示任务处于等待消息邮箱状态
OS_STAT_Q          表示任务处于等待消息队列状态
OS_STAT_SUSPEND  表示任务处于被挂起状态
OS_STAT_MUTEX    表示任务处于等待互斥型信号量状态

3.任务挂起和恢复
注:任务挂起和恢复不可用于空闲任务
挂起函数:OSTaskSuspend(); 恢复函数:OSTaskReSume();

4.任务的删除
删除函数:OSTaskDel(INT8U prio);

5.信号量

OSSemPend的函数原型为:
void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U err)

pevent:就是要请求的信号量地址;
timeout:请求的超时时间,如果为0表示无限时等待;
err:用来返回是否出错。每执行一次

OSSemPend,OSEventCnt就会减1。如果OSEventCnt值为0,执行OSSemPend时,当时任务将因为无法得到相应的资源而被 挂起。

OSSemPost的函数原型为:
INT8U OSSemPost(OS_EVENT *pevent),
同样pevent 就是要发送的信号量地址;
每执行一次OSSemPost,OSEventCnt就会加1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农-老七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值