1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
小弟最近在学习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);//清屏,并加入相应的颜色 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,配置了串口中断,而我在后面的程序中并没有使用串口,为什么会使程序卡死呢,有没有大神可以解释一下。。。 谢谢了 |
|
相关推荐
6个回答
|
|
有没有人呀。。。@
|
|
|
|
谁看呀!像论文
|
|
|
|
仿真跟踪看问题
|
|
|
|
是不是你用的lcd的历程里有printf哇
|
|
|
|
没有用到,printf那一部分我都去掉了
|
|
|
|
printf去掉了 ,那配置里USB LIB有没有勾上,勾上了就给去掉
|
|
|
|
只有小组成员才能发言,加入小组>>
793 浏览 0 评论
1152 浏览 1 评论
2528 浏览 5 评论
2861 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2711 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1073浏览 3评论
195浏览 2评论
457浏览 2评论
370浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 04:59 , Processed in 1.087157 second(s), Total 58, Slave 49 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号