完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我这几天刚开始学uCOS-III,是按照原子的UCOS开发手册移植的系统,编译也通过了。
根据例程,创建了两个任务,一个是开始任务,一个是LED任务,优先级分别为3和4。 但在主函数创建了开始任务后,一旦开启UCOSIII,程序就跑飞了,通过硬件调试,发现CPU一直在执行空闲任务,各个方法都试了,也查了很多东西,但还是未解决。 我使用的不是开发板,是自己做的板子,MCU型号为STM32F103C8T6,所有硬件在不加操作系统的情况下裸奔都没有问题。 【main.c】文件代码 #include "include.h" #include "math.h" //模块正常:KEY,LED,BEEP,OLED //任务优先级 #define START_TASK_PRIO 3u //任务堆栈大小 #define START_STK_SIZE 512 //任务控制块 OS_TCB StartTaskTCB; //任务堆栈 CPU_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *p_arg); //任务优先级 #define LED_TASK_PRIO 4u //任务堆栈大小 #define LED_STK_SIZE 128 //任务控制块 OS_TCB LEDTaskTCB; //任务堆栈 CPU_STK LED_TASK_STK[START_STK_SIZE]; //任务函数 void LED_task(void *p_arg); void MYRCC_DeInit(void) { RCC->APB1RSTR = 0x00000000;//复位结束 RCC->APB2RSTR = 0x00000000; RCC->AHBENR = 0x00000014; //睡眠模式闪存和SRAM时钟使能.其他关闭. RCC->APB2ENR = 0x00000000; //外设时钟关闭. RCC->APB1ENR = 0x00000000; RCC->CR |= 0x00000001; //使能内部高速时钟HSION RCC->CFGR &= 0xF8FF0000; //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0] RCC->CR &= 0xFEF6FFFF; //复位HSEON,CSSON,PLLON RCC->CR &= 0xFFFBFFFF; //复位HSEBYP RCC->CFGR &= 0xFF80FFFF; //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE RCC->CIR = 0x00000000; //关闭所有中断 //配置向量表 #ifdef VECT_TAB_RAM SCB->VTOR = 0x20000000|(0x0 & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器 #else SCB->VTOR = 0x08000000|(0x0 & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器 #endif } void Stm32_Clock_Init(u8 PLL) { unsigned char temp=0; MYRCC_DeInit(); //复位并配置向量表 RCC->CR|=0x00010000; //外部高速时钟使能HSEON while(!(RCC->CR>>17));//等待外部时钟就绪 RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1; PLL-=2; //抵消2个单位(因为是从2开始的,设置0就是2) RCC->CFGR|=PLL<<18; //设置PLL值 2~16 RCC->CFGR|=1<<16; //PLLSRC ON FLASH->ACR|=0x32; //FLASH 2个延时周期 RCC->CR|=0x01000000; //PLLON while(!(RCC->CR>>25));//等待PLL锁定 RCC->CFGR|=0x00000002;//PLL作为系统时钟 while(temp!=0x02) //等待PLL作为系统时钟设置成功 { temp=RCC->CFGR>>2; temp&=0x03; } } int main(void) { OS_ERR err; CPU_SR_ALLOC(); Stm32_Clock_Init(9);//初始化系统时钟 Beep_Init(); //初始化蜂鸣器 Beep_ms(30); LED_Init(); //初始化LED Key_Init(); //初始化按键 OLED_Init(); //初始化OLED IIC_Init(); //初始化软件IIC Init_FXOS_8700(); //初始化加速度计 ADC1_Init(); //初始化ADC uart_init(115200); //初始化串口 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 // tiM3_Int_Init(4000,900);//10Khz的计数频率,计数到5000为500ms 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 )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); //开启UCOSIII OS_CPU_SysTickInit(SystemCoreClock/OSCfg_TickRate_Hz); 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 OS_CRITICAL_ENTER(); //进入临界区 //创建LED0任务 OSTaskCreate((OS_TCB * )&LEDTaskTCB, (CPU_CHAR * )"led0 task", (OS_TASK_PTR )LED_task, (void * )0, (OS_PRIO )LED_TASK_PRIO, (CPU_STK * )&LED_TASK_STK[0], (CPU_STK_SIZE)LED_STK_SIZE/10, (CPU_STK_SIZE)LED_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )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(); //进入临界区 } //led任务函数 void LED_task(void *p_arg) { OS_ERR err; p_arg = p_arg; while(1) { LED_Crtl(0); OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延时200ms LED_Crtl(1); OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms } } 代码太多了,我就不一个个复制粘贴了,直接上传工程文件! GDP_UCOS_TEST.zip (626.14 KB ) |
|
相关推荐
1个回答
|
|
关注中····
|
|
|
|
只有小组成员才能发言,加入小组>>
702 浏览 0 评论
1111 浏览 1 评论
2476 浏览 5 评论
2810 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2654 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
656浏览 9评论
651浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
785浏览 6评论
632浏览 5评论
672浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 14:15 , Processed in 0.986104 second(s), Total 84, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号