| 同时挂起多个任务,串口打断了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;
 
 }
 
 
 
 
 |