标题:
STM32 UOSII系统任务调度源码
[打印本页]
作者:
hg1234
时间:
2018-8-23 15:37
标题:
STM32 UOSII系统任务调度源码
UCOSII系统建立了两个优先级不同的任务
通过设置任务间的延时实时调度任务
寄存器版程序验证OK
例如优先级别为64
系统空闲任务为最低优先级64-1
统计任务优先级为64-2
任务堆栈
堆栈为后进先出,先进后出
任务创建时应该依据处理堆栈的生长方向(向上生长【低地址在下】和向下生长【低地址在上】)
M3的栈生长方向为高地址向低地址增长即向上增长的
栈的地址是从顶端开始传递的
优先级使用
0 1 2 3 OS_LOWEST_PRIO-3 OS_LOWEST_PRIO-2 OS_LOWEST_PRIO-1 OS_LOWEST_PRIO
开发者:h
stm32单片机源程序如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO 6
//设置任务堆栈大小
#define LED0_STK_SIZE 64
//任务堆栈
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO 7
//设置任务堆栈大小
#define LED1_STK_SIZE 64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);
//LED2任务
//设置任务优先级
#define LED2_TASK_PRIO 8
//设置任务堆栈大小
#define LED2_STK_SIZE 64
//任务堆栈
OS_STK LED2_TASK_STK[LED2_STK_SIZE];
//任务函数
void led2_task(void *pdata);
//LED3任务
//设置任务优先级
#define LED3_TASK_PRIO 9
//设置任务堆栈大小
#define LED3_STK_SIZE 64
//任务堆栈
OS_STK LED3_TASK_STK[LED3_STK_SIZE];
//任务函数
void led3_task(void *pdata);
//任务函数解析
//OSTimeTick() 系统服务函数 时钟节拍函数
//OSTimeTickHook() 时钟节拍外连函数
//OSTimeDly() OSTimeDlyHMSM() 任务延时函数
//OSTaskStat() 统计时间运行任务 用来计算CPU使用率
//OSStatInit() 系统统计初始化函数
//OS_TaskIdle() 空闲任务
//OS_TaskStat() 统计任务
//TickTask() 时钟节拍任务
//OSTickISR() 时钟节拍中断服务函数
//OSVersion() 获取UCOS的版本号
//OSTaskDel(OS_PRIO_SELF) 任务删除
//OSTaskCreateExt 任务创建扩展函数
//OSTaskStkChk() 堆栈检验函数
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //初始化串口
// LED_Init();
LED_Init(); //初始化与LED连接的硬件接口
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OSSysTickInit();
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
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(); //退出临界区(可以被中断打断)
}
/***************************************/
void delay(u16 tt)
{
u16 kk;
while(tt--)
{
for(kk=0;kk<8000;kk++)
;
}
}
//LED0任务
void led0_task(void *pdata)
{
while(1)
{
OSTimeDly(2);//自身延时函数 OSTimeDlyHMSM()表示等待状态
/* LED0=0;
delay_ms(80);
LED0=1;
delay_ms(920);
printf("按键1已经按下\r\n"); */
if(KEY22==0)
{
delay_ms(10);
if(KEY22==0)
{
while(KEY22==0);
delay_ms(10);
while(KEY22==0);
Uart1_PutString("按键1已经按下\r\n");
}
}
};
}
//LED1任务
void led1_task(void *pdata)
{
while(1)
{
OSTimeDly(2);
switch(FLAG_YY)
{
case 1:printf("任务2成功实现\r\n");FLAG_YY=0;break;
case 2:printf("22任务成功实现\r\n");FLAG_YY=0;break;
case 3:printf("33任务成功实现\r\n");FLAG_YY=0;break;
default:break;
}
/* LED1=0;
delay_ms(300);
LED1=1;
printf("按键已经按下\r\n");
delay_ms(300); */
/* if(KEY_K==0)
{
delay_ms(10);
if(KEY_K==0)
{
while(KEY_K==0);
delay_ms(10);
while(KEY_K==0);
printf("按键2已经按下\r\n");
}
} */
};
}
//LED2任务
void led2_task(void *pdata)
{
while(1)
{
OSTimeDly(2);
if(KEY_K==0)
{
delay_ms(10);
if(KEY_K==0)
{
while(KEY_K==0);
delay_ms(10);
while(KEY_K==0);
printf("led 状态反转\r\n");
}
}
/* LED1=0;
delay_ms(300);
LED1=1;
printf("按键已经按下\r\n");
delay_ms(300); */
/* if(KEY_K==0)
{
delay_ms(10);
if(KEY_K==0)
{
while(KEY_K==0);
delay_ms(10);
while(KEY_K==0);
printf("按键2已经按下\r\n");
}
} */
};
}
//LED3任务
void led3_task(void *pdata)
{
while(1)
{
OSTimeDly(2);
if(KEY11==0)
{
delay_ms(10);
if(KEY11==0)
{
while(KEY11==0);
delay_ms(10);
while(KEY11==0);
printf("led1 状态反转\r\n");
}
}
/* LED1=0;
delay_ms(300);
LED1=1;
printf("按键已经按下\r\n");
delay_ms(300); */
/* if(KEY_K==0)
{
delay_ms(10);
if(KEY_K==0)
{
while(KEY_K==0);
delay_ms(10);
while(KEY_K==0);
printf("按键2已经按下\r\n");
}
} */
};
}
复制代码
所有资料51hei提供下载:
STM32UCOSII 任务调度.rar
(402.17 KB, 下载次数: 13)
2018-8-23 18:13 上传
点击文件名下载附件
ucosii 任务调度
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1