OpenEdv-开源电子网

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

UOSCII 串口打断了LED,只能开启一个任务

[复制链接]

34

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2018-10-30
在线时间
160 小时
发表于 2022-7-7 15:22:23 | 显示全部楼层 |阅读模式
   同时挂起多个任务,串口打断了LED亮灭是什么问题

#include "sys.h"        
#include "delay.h"       
#include "led.h"
#include "includes.h"
#include "usart.h"         
#define  Const_485 PBout(0)
//START 任务
//设置任务优先级
#define START_TASK_PRIO                              10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE                                  64
//任务堆栈       
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);       
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO                               16
//设置任务堆栈大小
#define LED0_STK_SIZE                                      64
//任务堆栈       
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO                               4
//设置任务堆栈大小
#define LED1_STK_SIZE                                          64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);

//LED1任务
//设置任务优先级
#define FS_TASK_PRIO                               1
//设置任务堆栈大小
#define FS_STK_SIZE                                          64
//任务堆栈
OS_STK FS_TASK_STK[FS_STK_SIZE];
//任务函数
void FS_task(void *pdata);

void  rs485_UartWrite(u8 *buf ,u8 len);        
unsigned int GetCRC16(unsigned char *ptr,  unsigned char len)
{
    u16 index;
    u8 crch = 0xFF;  //高CRC字节
    u8 crcl = 0xFF;  //低CRC字节
    u8  TabH[] = {  //CRC高位字节值表
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40  
    } ;  
    u8 TabL[] = {  //CRC低位字节值表
        0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,  
        0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,  
        0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,  
        0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,  
        0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,  
        0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,  
        0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,  
        0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,  
        0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,  
        0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,  
        0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,  
        0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,  
        0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,  
        0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,  
        0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,  
        0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,  
        0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,  
        0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,  
        0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,  
        0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,  
        0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,  
        0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,  
        0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,  
        0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,  
        0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,  
        0x43, 0x83, 0x41, 0x81, 0x80, 0x40  
    } ;

    while (len--)  //计算指定长度CRC
    {
        index = crch ^ *ptr++;
        crch = crcl ^ TabH[index];
        crcl = TabL[index];
    }

    return ((crch<<8) | crcl);  
}

void Rs485const()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOA\G时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;        //TX-485        //串口输出PA2
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;                  //复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;       
GPIO_Init(GPIOB,&GPIO_InitStructure);                /* 初始化串口输入IO */
}

int main(void)
{       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        delay_init();            //延时函数初始化          
                          //初始化与LED连接的硬件接口
        uart_init(9600);
        Rs485const();
         LED_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(FS_task,(void *)0,(OS_STK*)&FS_TASK_STK[FS_STK_SIZE-1],FS_TASK_PRIO);         
        OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);                                           
  OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);       
        OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
        OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
}

//LED0任务
void led0_task(void *pdata)
{                
        while(1)
        {
                LED0=0;
                delay_ms(800);
                LED0=1;
                delay_ms(920);
        };
}

//LED1任务
void led1_task(void *pdata)
{          
        while(1)
        {
                LED1=0;
                delay_ms(500);
                LED1=1;
                delay_ms(500);
        };
}
void FS_task(void *pdata)
{
  u8 buf[8];
         u16 calCRC;
  u8 i=100;
        while(1)
        {
         
                  buf[0] =1;
    buf[1] = 0x03;    //modbus 指令码03
    buf[2] = 0x00;  
    buf[3] = 0x00;  
    buf[4] = 0x00;
    buf[5] = 0x06;
    calCRC=GetCRC16(buf,6);
          buf[6]=(calCRC>>8)&0xFF;
          buf[7]=(calCRC)&0xFF;
    rs485_UartWrite(buf,8);        
          while(i--)
                {
                  
                        delay_ms(1);
                }
                       
        }               
}       
void  rs485_UartWrite(u8 *buf ,u8 len)                                                                                 //发送
{
        u8 i=0;
Const_485=1;       
delay_ms(1);                                                               //3MS延时
    for(i=0;i<len;i++)
    {
        USART_SendData(USART1,buf[i]);                                              //通过USARTx外设发送单个数据

                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);             //检查指定的USART标志位设置与否,发送数据空位标志
    }

                delay_ms(1);
        Const_485=0;                       
}

       





uint16_t Sample_Pt100(uint8_t addr)
{
          uint8_t i,buf[8], waittime = 100;
          uint16_t val;
          u8 len;
    u16 calCRC;
    buf[0] =addr;
    buf[1] = 0x03;    //modbus 指令码03
    buf[2] = 0x00;  
    buf[3] = 0x00;  
    buf[4] = 0x00;
    buf[5] = 0x06;
    calCRC=GetCRC16(buf,6);
          buf[6]=(calCRC>>8)&0xFF;
          buf[7]=(calCRC)&0xFF;
    rs485_UartWrite(buf,8);                

while(--waittime)
{
        delay_ms(5);
}       
return 3;  

}
       
uint16_t Sample_CH4(uint8_t addr)
{
          uint8_t buf[8], loc = 0, waittime = 100;
    u8 len;
    u16 calCRC;
    buf[loc++] = addr;
          buf[loc++] = 0x03;
          buf[loc++] = 0x00;
          buf[loc++] = 0x00;
          buf[loc++] = 0x00;
          buf[loc++] = 0x01;
          calCRC = GetCRC16(buf, loc);
          buf[loc++] =calCRC / 256;
          buf[loc++] =calCRC% 256;
          rs485_UartWrite(buf,8);
while(--waittime)
{
        delay_ms(5);

}
        return 1;

}



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

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-7-7 16:00:48 | 显示全部楼层
delay_ms是让出CPU呢还是死循环呢
专治疑难杂症
回复 支持 反对

使用道具 举报

34

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2018-10-30
在线时间
160 小时
 楼主| 发表于 2022-7-7 16:07:35 | 显示全部楼层
LcwSwust 发表于 2022-7-7 16:00
delay_ms是让出CPU呢还是死循环呢

与这个没关系吧,串口运行了LED就挂了
回复 支持 反对

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-7-7 16:10:43 | 显示全部楼层
sr861126 发表于 2022-7-7 16:07
与这个没关系吧,串口运行了LED就挂了

有关系,如果是死循环,那么高优先级任务就一直占着CPU不放,别的任务是没机会运行的。
应改为OSTimeDly
专治疑难杂症
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 12:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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