OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2502|回复: 6

我的ucos开始任务写的有问题吗?为什么总是不能执行呢?

[复制链接]

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2017-1-29 11:24:25 | 显示全部楼层 |阅读模式
1金钱
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "LCD.h"

//UCOSIII中以下优先级用户程序不能使用,ALIENTEK
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()

/****start_task******/
//任务优先级
#define START_TASK_PRIO                3
//任务堆栈大小(字节)       
#define START_STK_SIZE                 128       
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈       
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);

/****tesk1_tesk******/
#define TASK1_TASK_PRIO                4       
#define TASK1_STK_SIZE                 128       
OS_TCB  TASK1TaskTCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);

int main(void)
{
  OS_ERR  *err;//错误类型报告
        CPU_SR_ALLOC();//定义并将CPU的状态写为0(大概在进入临界区之前都要定义)
        //初始化外设部分
        delay_init();
        LED_Init();
        LCD_Init();
        OSInit(err);//ucos初始化       
        //进入临界区
        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  )0,                                                //任务内部消息队列能够接收的最大消息数目,为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);//启动操作系统       
                                                                 
}
//起始任务(创建其他任务)
void start_task(void *p_arg)
{
        OS_ERR  *err;//错误类型报告
        CPU_SR_ALLOC();
        p_arg = p_arg;
        CPU_Init();
        LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-3");
        OS_CRITICAL_ENTER();
        //创建第二个任务       
        OSTaskCreate(  (OS_TCB         * )&TASK1TaskTCB,                    //任务控制块
                                         (CPU_CHAR        * )"task1 task",                   //任务名字(字符串)
                 (OS_TASK_PTR )task1_task,                           //任务函数
                 (void                * )0,                                                  //传递给任务函数的参数
                 (OS_PRIO          )TASK1_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],//任务堆栈基地址
                 (CPU_STK_SIZE)TASK1_STK_SIZE/10,        //任务堆栈深度限位
                 (CPU_STK_SIZE)TASK1_STK_SIZE,                //任务堆栈大小
                 (OS_MSG_QTY  )0,                                                //任务内部消息队列能够接收的最大消息数目,为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();
                                                                 
        OSTaskDel((OS_TCB*)0,err);        //删除start_task任务自身                                                         
}

//task1_task任务,使显示屏每一秒刷一次屏
void task1_task(void *p_arg)
{
        OS_ERR  *err;//错误类型报告
        char i=2;
        unsigned int color[]={0xFFFF,0x0000,0x001F};
        while(1)
        {
                LCD_Clear(color[i]);//清屏,并加入相应的颜色
                LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-3");
                i++;
                if(i==3)i=0;       
                //任务延时500ms
                OSTimeDly(500,OS_OPT_TIME_HMSM_STRICT,err);
        }
}

以上为源代码,帮忙看看吧,谢谢了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
发表于 2017-1-29 15:30:40 | 显示全部楼层
执行完。退出主函数了?
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
 楼主| 发表于 2017-1-30 11:10:48 | 显示全部楼层
他说他不在 发表于 2017-1-29 15:30
执行完。退出主函数了?

我不是启动任务调度了吗?应该会跳到开始任务去执行呀
回复

使用道具 举报

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
发表于 2017-1-30 13:59:07 | 显示全部楼层
我说的是。主函数已经出栈了、、
回复

使用道具 举报

47

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2016-1-2
在线时间
80 小时
发表于 2017-2-5 21:28:06 | 显示全部楼层
主函数最后加 while(1);
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
 楼主| 发表于 2017-2-6 11:58:19 | 显示全部楼层
2938690046 发表于 2017-2-5 21:28
主函数最后加 while(1);

不是加while(1)的原因,而是在main函数初始化的时候需要加上时间初始化提供心跳节拍与串口初始化(我现在是不能理解加上串口初始化的作用)根据正点原子的例程,但是去掉的话就是出现复位之后死机的情况。
回复

使用道具 举报

5

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2016-10-27
在线时间
76 小时
发表于 2017-2-7 12:10:50 | 显示全部楼层
err 野指针  不知道你发现没有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 00:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表