完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "includes.h"
#define START_TASK_PRIO 10 #define START_STK_SIZE 128 OS_STK START_TAST_STK[START_STK_SIZE]; void start_task(void *pdata); #define LED0_TASK_PRIO 7 #define LED0_STK_SIZE 64 OS_STK LED0_TASK_STK[LED0_STK_SIZE]; void led0_task(void *pdata); #define LED1_TASK_PRIO 6 #define LED1_STK_SIZE 128 OS_STK LED1_TASK_STK[LED1_STK_SIZE]; void led1_task(void *pdata); #define FLOAT_TASK_PRIO 5 #define FLOAT_STK_SIZE 128 __align(8) OS_STK FLOAT_TASK_STK[FLOAT_STK_SIZE]; void float_task(void *pdata); int main(void) { OS_CPU_SystickInit(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LED_Init(); TIM3_Int_Init(); OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *) &START_TAST_STK[START_STK_SIZE-1],START_TASK_PRIO); OSStart(); } void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata=pdata; OSStatInit(); OS_ENTER_CRITICAL(); OSTaskCreate(led0_task,(void *)0,(OS_STK *) &LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); OSTaskCreate(led1_task,(void *)0,(OS_STK *) &LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); OSTaskCreate(float_task,(void *)0,(OS_STK *) &FLOAT_TASK_STK[FLOAT_STK_SIZE-1],FLOAT_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); OS_EXIT_CRITICAL(); } void led0_task(void *pdata) { while(1) { OS_CPU_SR cpu_sr=0; OS_ENTER_CRITICAL(); LED0=0; delay_ms(50);//TIM3做的延时 LED0=1; delay_ms(50); OS_EXIT_CRITICAL(); OSTimeDly(10); } } void led1_task(void *pdata) { while(1) { OS_CPU_SR cpu_sr=0; OS_ENTER_CRITICAL(); LED1=0; delay_ms(1000); LED1=1; delay_ms(1000); OS_EXIT_CRITICAL(); OSTimeDly(10); } } void float_task(void *pdata) { OS_CPU_SR cpu_sr=0; static float float_num=0.01; while(1) { float_num+=0.01f; OS_ENTER_CRITICAL(); printf("êä3öfloat_num:%.4frn",float_num); delay_ms(500); OS_EXIT_CRITICAL(); OSTimeDly(30); } } LED1灯闪烁正常,LED0亮的时间正常,但灭的时间过长,一直要等到LED1亮时才亮,串口打印也不是500ms,感觉是5s |
|
相关推荐
4个回答
|
|
你这个不能用你自己做的delay_ms来延时,因为你这个延时没有任务切换;你的LED1正常显示是因为你的LED1的优先级高于LED0,这样在它得到CPU的资源的时候,只要不调用ucos系统自己的延时函数,它会一直执行;你的LED0执行的时候,只要你的LED1的系统延时时间到了就会被抢占,这样你的LED0的闪烁就不准了。 你可以把LED0的优先级设置成比LED1高,这样你的LED0就正常了,而LED1就不正常了,你可以测试一下
|
|
|
|
要是用delay_ms();该怎么用怎么改?大神
void TIM3_Int_Init(void) { RCC->APB1ENR|=1<<1; //TIM6ê±Öóê1Äü } //0 { TIM3->PSC=36000-1; TIM3->CNT=0x00; TIM3->ARR=ms*2; //é趨¼ÆêyÆ÷×Ô¶ˉÖØ×°Öμ // TIM6->EGR = 0x0001; //UG=1 ᢿì¸üDÂÔ¤·ÖÆμÆ÷£¬á¢¿ìÇå¿Õ¼ÆêyÆ÷£¬μ«»á2úéú¸üDÂÖD¶Ï£¬ê1UIFÖÃ1 // TIM6->CR1|=(1<<3); TIM6->SR&=0x00; // TIM3->DIER=0x01; TIM3->CR1|=0x05; //ARPE:ÎT»o3壬UDIS£oéÏòç2úéú¸üDÂê¼t£¬USR£o¸üDÂÔ′Ö»óDéÏÏÂòç while((TIM3->SR&0x01)==0); //μè′yê±¼äμ½′ï ¸üDÂÖD¶Ï±ê־루¸üDÂê¼t£oò2êǶÔARRoíPSC¸üD£© TIM3->SR=0x00; TIM3->CR1&=~(1<<0); } |
|
|
|
任务不能切换的原因很多,节拍,栈大小,甚至你的系统是否移植好
|
|
|
|
在delay_ms()里面调用系统的延时函数,只能这样,因为你的delay函数是死循环实现的
|
|
|
|
只有小组成员才能发言,加入小组>>
705 浏览 0 评论
1114 浏览 1 评论
2491 浏览 5 评论
2826 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2671 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
661浏览 9评论
671浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
789浏览 6评论
634浏览 5评论
679浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 00:55 , Processed in 1.148074 second(s), Total 86, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号