OpenEdv-开源电子网

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

ucos例程中一个很奇怪的问题

[复制链接]

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2017-2-1 12:15:05 | 显示全部楼层 |阅读模式
1金钱
小弟最近在学习ucos,在做实验时对于main()函数里的初始化外设有点奇怪,不需要用到的初始化我都去掉了,然后问题来了
以下是源码
#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()

//任务优先级
#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);

//任务1
#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);

unsigned int color[]={0xFFFF,0x0000,0xFFE0};//定义颜色
char i=0;       
int main(void)
{
OS_ERR err;
        CPU_SR_ALLOC();
        delay_init();  //时钟初始化
        uart_init(115200);   //串口初始化
        LCD_Init();                        //LCD初始化       
       
        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;
        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   * )&TASK1_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*)&StartTaskTCB,&err);        //删除start_task任务自身                                                         
}

//task1_task任务,使显示屏每一秒刷一次屏
void task1_task(void *p_arg)
{
        OS_ERR  err;//错误类型报告
       
        while(1)
        {
                LCD_Clear(color[i]);//清屏,并加入相应的颜色
                if(i==3)i=0;               
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
                i++;
        }
}

其中把串口初始化这句话去掉之后,再下载会发现,程序只能运行一次,在硬件复位之后,程序就卡死了,查看串口初始化里的内容
void uart_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
        USART_DeInit(USART1);  //复位串口1
         //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10

   //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

   //USART 初始化设置
        USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);                    //使能串口

}

仅仅初始化了2个IO,配置了串口中断,而我在后面的程序中并没有使用串口,为什么会使程序卡死呢,有没有大神可以解释一下。。。
谢谢了

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

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
 楼主| 发表于 2017-2-2 10:56:17 | 显示全部楼层
回复

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-11-27
在线时间
11 小时
发表于 2017-2-10 16:38:04 | 显示全部楼层
谁看呀!像论文
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2017-2-10 18:43:46 | 显示全部楼层
仿真跟踪看问题
回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-27
在线时间
23 小时
发表于 2017-2-13 22:48:03 | 显示全部楼层
是不是你用的lcd的历程里有printf哇
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
 楼主| 发表于 2017-2-14 10:53:02 | 显示全部楼层
zzz 发表于 2017-2-13 22:48
是不是你用的lcd的历程里有printf哇

没有用到,printf那一部分我都去掉了
回复

使用道具 举报

20

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2015-10-2
在线时间
59 小时
发表于 2017-2-14 15:12:21 | 显示全部楼层
周亚龙 发表于 2017-2-14 10:53
没有用到,printf那一部分我都去掉了

printf去掉了 ,那配置里USB LIB有没有勾上,勾上了就给去掉
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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