OpenEdv-开源电子网

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

UCOS任务调度的问题,请大神帮忙看看,非常的感谢!

[复制链接]

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
发表于 2016-8-11 11:26:36 | 显示全部楼层 |阅读模式
3金钱
想使用任务调度,来做一个温度和时钟的显示,现在只能显示正确的温度,而不能显示时间,请大神帮忙看看问题,谢谢了!代码如下:


#include <stm32f10x.h>
#include "sys.h"
#include "usart.h"               
#include "delay.h"       
#include "led.h"
#include "includes.h"
#include "ds18b20.h"
#include "rtc.h"
#include "lcd.h"

/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO                              10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE                                  64
//任务堆栈       
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);       
                          
//RTC任务
//设置任务优先级
#define RTC_TASK_PRIO                               7
//设置任务堆栈大小
#define RTC_STK_SIZE                                      64
//任务堆栈       
OS_STK RTC_TASK_STK[RTC_STK_SIZE];
//任务函数
void rtc_task(void *pdata);


//LED1任务
//设置任务优先级
#define DS18B20_TASK_PRIO                               6
//设置任务堆栈大小
#define DS18B20_STK_SIZE                                          64
//任务堆栈
OS_STK DS18B20_TASK_STK[DS18B20_STK_SIZE];
//任务函数
void ds18b20_task(void *pdata);

int main(void)
{                                   
        Stm32_Clock_Init(9); //系统时钟设置
        delay_init(72);             //延时初始化               
        LED_Init();                 //初始化与LED连接的硬件接口
        LCD_Init();
        OSInit();   
        OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
        OSStart();       
           
}

          
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
        pdata = pdata;
          OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)   
        OSTaskCreate(rtc_task,(void *)0,(OS_STK*)&RTC_TASK_STK[RTC_STK_SIZE-1],RTC_TASK_PRIO);                                                  
        OSTaskCreate(ds18b20_task,(void *)0,(OS_STK*)&DS18B20_TASK_STK[DS18B20_STK_SIZE-1],DS18B20_TASK_PRIO);                                           
        OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
        OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
}

//DS18B20任务
void ds18b20_task(void *pdata)
{                             
       
        u8 t=0;
    short temperature;   
    while(1)
        {       
                delay_ms(100);
                LCD_Clear(MAGENTA);
                BACK_COLOR=MAGENTA;
                POINT_COLOR=BLUE;//设置字体为蓝色        
                while(DS18B20_Init())        //DS18B20初始化       
                {
                        LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
                        delay_ms(200);
                        LCD_Fill(60,130,239,130+16,WHITE);
                        delay_ms(200);
                }       
                      
                while(1)
                {          
                         
                        if(t%10==0)//每100ms读取一次
                        {                                                                          
                                temperature=DS18B20_Get_Temp();
                                if((temperature/10)>28.0)
                                 {
                                         LED1=1;
                                         LED0=0;
                                 }       
                                 else if((temperature/10)<28.0)
                                 {
                                         LED1=0;
                                         LED0=1;
                                 }
                                 LCD_ShowString(60,30,200,16,16,"DS18B20");
                                 LCD_ShowString(60,50,200,16,16,"Temp:   . C");       
                                if(temperature<0)
                                {
                                        LCD_ShowChar(60+40,50,'-',16,0);                        //显示负号
                                        temperature=-temperature;                                        //转为正数
                                }else LCD_ShowChar(60+40,50,' ',16,0);                        //去掉负号
                                LCD_ShowNum(60+40+8,50,temperature/10,2,16);        //显示正数部分            
                                LCD_ShowNum(60+40+32,50,temperature%10,1,16);        //显示小数部分
                               
                        }                                  
                        delay_ms(10);
                        t++;
                        if(t==20)
                        {
                                t=0;
                        }
                }
        };
}

//RTC任务
void rtc_task(void *pdata)
{          
        u8 t;                  
    while(1)
        {       
        delay_ms(200);                       
                LCD_Clear(MAGENTA);
                BACK_COLOR=MAGENTA;
                POINT_COLOR=BLUE;//设置字体为蓝色        
                while(RTC_Init())                //RTC初始化        ,一定要初始化成功
                {
                        LCD_ShowString(60,130,200,16,16,"RTC ERROR!   ");       
                        delay_ms(800);
                        LCD_ShowString(60,130,200,16,16,"RTC Trying...");       
                }                                                                   
                //显示时间
                POINT_COLOR=BLUE;//设置字体为蓝色                                         
                LCD_ShowString(60,130,200,16,16,"    -  -     ");          
                LCD_ShowString(60,162,200,16,16,"  :  :  ");                             
                while(1)
                {                                                                    
                        if(t!=calendar.sec)
                        {
                                t=calendar.sec;
                                LCD_ShowNum(60,130,calendar.w_year,4,16);                                                                          
                                LCD_ShowNum(100,130,calendar.w_month,2,16);                                                                          
                                LCD_ShowNum(124,130,calendar.w_date,2,16);         
                                switch(calendar.week)
                                {
                                        case 0:
                                                LCD_ShowString(60,148,200,16,16,"Sunday   ");
                                                break;
                                        case 1:
                                                LCD_ShowString(60,148,200,16,16,"Monday   ");
                                                break;
                                        case 2:
                                                LCD_ShowString(60,148,200,16,16,"Tuesday  ");
                                                break;
                                        case 3:
                                                LCD_ShowString(60,148,200,16,16,"Wednesday");
                                                break;
                                        case 4:
                                                LCD_ShowString(60,148,200,16,16,"Thursday ");
                                                break;
                                        case 5:
                                                LCD_ShowString(60,148,200,16,16,"Friday   ");
                                                break;
                                        case 6:
                                                LCD_ShowString(60,148,200,16,16,"Saturday ");
                                                break;  
                                }
                                LCD_ShowNum(60,162,calendar.hour,2,16);                                                                          
                                LCD_ShowNum(84,162,calendar.min,2,16);                                                                          
                                LCD_ShowNum(108,162,calendar.sec,2,16);
                                LED0=!LED0;
                        }       
                        delay_ms(10);                                                                  
                };                
        };
}




最佳答案

查看完整内容[请看2#楼]

把任务中的延时函数换成系统延时,高优先级的任务一直在占用CPU
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

40

帖子

0

精华

高级会员

Rank: 4

积分
756
金钱
756
注册时间
2016-2-25
在线时间
137 小时
发表于 2016-8-11 11:26:37 | 显示全部楼层
把任务中的延时函数换成系统延时,高优先级的任务一直在占用CPU
回复

使用道具 举报

18

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-8-11
在线时间
64 小时
发表于 2016-8-11 13:02:00 | 显示全部楼层
高优先级的任务没有放弃对内核的占用吧,低优先级的任务一直在等待中。。
回复

使用道具 举报

18

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-8-11
在线时间
64 小时
发表于 2016-8-11 13:50:31 | 显示全部楼层
黎明前沉寂 发表于 2016-8-11 13:13
把任务中的延时函数换成系统延时,高优先级的任务一直在占用CPU

哈哈,看来我说对了。我还没用过ucos呢~话说大神,能不能帮我看看stm32的nrf24l01怎么搞?我写了个求助帖,帮我看看呗
回复

使用道具 举报

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
 楼主| 发表于 2016-8-11 14:53:54 | 显示全部楼层
黎明前沉寂 发表于 2016-8-11 13:13
把任务中的延时函数换成系统延时,高优先级的任务一直在占用CPU

delay_ms()延时是采用SYSTEM文件中的,那个不属于系统延时吗?我把那个延时100ms和延时200ms改的更小3ms和5ms,也没有用,最后去掉,还是没有用。请大神耐心解答下
回复

使用道具 举报

18

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-8-11
在线时间
64 小时
发表于 2016-8-11 15:24:09 | 显示全部楼层
scx2006114 发表于 2016-8-11 14:53
delay_ms()延时是采用SYSTEM文件中的,那个不属于系统延时吗?我把那个延时100ms和延时200ms改的更小3ms ...

那你把两个任务的优先级对调一下,看看另一个功能能不能正常显示,排除你单个功能实现的问题。
回复

使用道具 举报

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
 楼主| 发表于 2016-8-11 16:22:40 | 显示全部楼层
BigDiong 发表于 2016-8-11 15:24
那你把两个任务的优先级对调一下,看看另一个功能能不能正常显示,排除你单个功能实现的问题。

是时钟任务有问题,但没有找出问题来,能不能帮忙看看?谢谢你
回复

使用道具 举报

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
 楼主| 发表于 2016-8-11 16:29:44 | 显示全部楼层
问题解决了,谢谢你们的帮助
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-3-30
在线时间
11 小时
发表于 2018-3-30 10:22:31 | 显示全部楼层
请问楼主怎么解决的
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-3-30
在线时间
11 小时
发表于 2018-3-30 10:22:49 | 显示全部楼层
scx2006114 发表于 2016-8-11 16:29
问题解决了,谢谢你们的帮助

怎么解决的啊楼主
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-30 10:45:32 | 显示全部楼层
shenlihui 发表于 2018-3-30 10:22
怎么解决的啊楼主

猜测是:#define SYSTEM_SUPPORT_OS                1       
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-3-30
在线时间
11 小时
发表于 2018-3-30 14:42:14 | 显示全部楼层
孟亮 发表于 2018-3-30 10:45
猜测是:#define SYSTEM_SUPPORT_OS                1

这个不打开 UCOS能用吗。。。。
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-30 15:15:22 | 显示全部楼层
shenlihui 发表于 2018-3-30 14:42
这个不打开 UCOS能用吗。。。。

那就是单任务了,或者你自己调用切换任务来切换或者用中断切换,delay是不会自动切换的。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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