新手上路
- 积分
- 27
- 金钱
- 27
- 注册时间
- 2018-6-20
- 在线时间
- 7 小时
|
1金钱
我看原子哥的emwin的例程,emwindemo的优先级设置为6,然后我在我的程序中设置为6就跑不起来,要跟start任务同优先级才能跑起来,这是为什么?
#include "Led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
#include "sys.h"
#include "Lcd5510.h"
#include "malloc.h"
#include "GUI.h"
#include "timer.h"
#include "touch.h"
#include "textdisplay.h"
#include "includes.h" //UCOSIII头文件
/*************************************************************************************************/
/*************************任务优先级*******************/
#define START_TASK_PRIO 3 //初始任务
#define APPTask1_TASK_PRIO 5 //任务1
#define Touch_TASK_PRIO 4 //触控任务
#define EmwinDemo_TASK_PRIO 6 //EmwinDemo任务
/*************************任务堆栈大小****************/
#define START_STK_SIZE 256 //初始任务堆栈大小
#define APPTask1_START_STK_SIZE 64 //任务1堆栈大小
#define Touch_START_STK_SIZE 128 //触摸任务堆栈大小
#define EmwinDemo_START_STK_SIZE 2048 //Demo任务堆栈大小
/*************************任务控制块******************/
OS_TCB StartTaskTCB; //初始任务任务控制块
OS_TCB APPTask1TCB; //任务1任务控制块
OS_TCB TouchTaskTCB; //触摸任务控制块
OS_TCB EmwinDemoTaskTCB; //Demo任务控制块
/************************任务堆栈*********************/
CPU_STK START_TASK_STK[START_STK_SIZE]; //初始任务堆栈
CPU_STK APPTask1_START_STK[APPTask1_START_STK_SIZE]; //任务1堆栈
CPU_STK TouchTask_START_STK[Touch_START_STK_SIZE]; //触摸任务堆栈
CPU_STK EmwinDemoTask_START_STK[EmwinDemo_START_STK_SIZE]; //Demo任务堆栈
/************************任务函数********************/
void start_task(void *p_arg);
void APPTask1(void *p_arg);
void TouchTask(void *p_arg);
void EmwinDemoTask(void *p_arg);
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
delay_init(); //延迟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init(); //Led灯初始化
KEY_Init(); //初始化按键
uart_init(115200);
TFTLCD_Init();
tp_dev.init();
my_mem_init(SRAMIN);
/*创建初始任务*/
OSInit(&err); //初始化UCOSIII
OS_CRITICAL_ENTER(); //进入临界区
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制
(CPU_CHAR *)"start task", //任务名字块
(OS_TASK_PTR )start_task, //任务函数
(void *)0, //传递给任务函数的参数
(OS_PRIO )START_TASK_PRIO, //任务优先级
(CPU_STK *)&START_TASK_STK[0], //任务堆栈基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY)5, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值
OS_CRITICAL_EXIT(); //退出临界区
OSStart(&err); //开启UCOSIII
while(1);
}
//初始任务函数
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //统计任务
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候
//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE); //打开CRC时钟
// WM_SetCreateFlags(WM_CF_MEMDEV);
GUI_Init(); //EMWIN初始化
OS_CRITICAL_ENTER(); //进入临界区
//EmwinDemo任务创建
OSTaskCreate((OS_TCB * )&EmwinDemoTaskTCB, //任务控制
(CPU_CHAR *)"EmwinDemo Task", //任务名字块
(OS_TASK_PTR )EmwinDemoTask, //任务函数
(void *)0, //传递给任务函数的参数
(OS_PRIO )EmwinDemo_TASK_PRIO, //任务优先级
(CPU_STK *)&EmwinDemoTask_START_STK[0], //任务堆栈基地址
(CPU_STK_SIZE)EmwinDemo_START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)EmwinDemo_START_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY)5, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值
//Touch任务创建
OSTaskCreate((OS_TCB * )&TouchTaskTCB, //任务控制
(CPU_CHAR *)"Touch Task", //任务名字块
(OS_TASK_PTR )TouchTask, //任务函数
(void *)0, //传递给任务函数的参数
(OS_PRIO )Touch_TASK_PRIO, //任务优先级
(CPU_STK *)&TouchTask_START_STK[0], //任务堆栈基地址
(CPU_STK_SIZE)Touch_START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)Touch_START_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY)5, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值
//创建APP任务
OSTaskCreate((OS_TCB * )&APPTask1TCB, //任务控制
(CPU_CHAR *)"APP Task1", //任务名字块
(OS_TASK_PTR )APPTask1, //任务函数
(void *)0, //传递给任务函数的参数
(OS_PRIO )APPTask1_TASK_PRIO, //任务优先级
(CPU_STK *)&APPTask1_START_STK[0], //任务堆栈基地址
(CPU_STK_SIZE)APPTask1_START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)APPTask1_START_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY)5, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值
OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起开始任务
OS_CRITICAL_EXIT(); //退出临界区
// OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身
}
//EmwinDemo任务
void EmwinDemoTask(void *p_arg)
{
printf("\r\nDebug1\r\n");
//GUI_CURSOR_Show(); //显示鼠标
printf("\r\nDebug4\r\n");
emwin_texttest();
//printf("\r\nDebug2\r\n");
while(1)
{
printf("\r\nDebug5\r\n");
GUI_Delay(100);
}
}
//触控任务
void TouchTask(void *p_arg)
{
printf("\r\nDebug2\r\n");
OS_ERR err;
while(1)
{
GUI_TOUCH_Exec();
OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_PERIODIC,&err);//延时5ms
}
}
//任务1
void APPTask1(void *p_arg)
{
printf("\r\nDebug3\r\n");
OS_ERR err;
p_arg = p_arg;
while(1)
{
LED1 = ~ LED1;
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err);
}
}
|
|