C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 1 C51 COMPILER V9.60.7.0, COMPILATION OF MODULE TASK OBJECT MODULE PLACED IN .\Objects\task.obj COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Task\task.c OMF2 OPTIMIZE(8,SPEED) BROWSE INCDIR(.\Src;.\Task;.\Task\cpu_po -rt\S92F8003A;.\Task\cfg;.\Task\pt_thread;.\SC92F8003_Lib\Inc) DEBUG CODE LISTINCLUDE SYMBOLS PRINT(.\Listings\task.lst) -PREPRINT(.\Listings\task.i) OBJECT(.\Objects\task.obj) line level source 1 #include "task.h" 1 =1 #ifndef _TASK_H_ 2 =1 #define _TASK_H_ 3 =1 4 =1 #include "cfg/al_helper.h" 1 =2 /* 2 =2 * taskdef.h 3 =2 * 4 =2 * Created on: 2023-4-20 5 =2 * Author: xukaiming 6 =2 */ 7 =2 8 =2 #ifndef _AL_HELPER_H_ 9 =2 #define _AL_HELPER_H_ 10 =2 11 =2 #ifdef __cplusplus =2 extern "C" { =2 #endif 14 =2 15 =2 #define AL_STATIC 16 =2 17 =2 18 =2 #ifdef __cplusplus =2 } =2 #endif 21 =2 22 =2 #endif 23 =2 5 =1 #include "cfg/task_cfg.h" 1 =2 /* 2 =2 * taskdef.h 3 =2 * 4 =2 * Created on: 2023-4-20 5 =2 * Author: xukaiming 6 =2 */ 7 =2 8 =2 #ifndef _TASK_CFG_H_ 9 =2 #define _TASK_CFG_H_ 10 =2 11 =2 #ifdef __cplusplus =2 extern "C" { =2 #endif 14 =2 15 =2 #define AL_STATIC 16 =2 17 =2 18 =2 #define TASK_NAME_LEN 16 19 =2 #define MAX_TIMER 5 // the number of timer can be used 20 =2 #define TICK_PER_S 1000 //1S中打点1000次 21 =2 22 =2 23 =2 24 =2 C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 2 25 =2 #ifdef __cplusplus =2 } =2 #endif 28 =2 29 =2 #endif 30 =2 6 =1 #include "task_hal.h" 1 =2 #ifndef _TASK_HAL_H_ 2 =2 #define _TASK_HAL_H_ 3 =2 4 =2 5 =2 #include "intrins.h" 1 =3 /*-------------------------------------------------------------------------- 2 =3 INTRINS.H 3 =3 4 =3 Intrinsic functions for C51. 5 =3 Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH 6 =3 All rights reserved. 7 =3 --------------------------------------------------------------------------*/ 8 =3 9 =3 #ifndef __INTRINS_H__ 10 =3 #define __INTRINS_H__ 11 =3 12 =3 #pragma SAVE 13 =3 14 =3 #if defined (__CX2__) =3 #pragma FUNCTIONS(STATIC) =3 /* intrinsic functions are reentrant, but need static attribute */ =3 #endif 18 =3 19 =3 extern void _nop_ (void); 20 =3 extern bit _testbit_ (bit); 21 =3 extern unsigned char _cror_ (unsigned char, unsigned char); 22 =3 extern unsigned int _iror_ (unsigned int, unsigned char); 23 =3 extern unsigned long _lror_ (unsigned long, unsigned char); 24 =3 extern unsigned char _crol_ (unsigned char, unsigned char); 25 =3 extern unsigned int _irol_ (unsigned int, unsigned char); 26 =3 extern unsigned long _lrol_ (unsigned long, unsigned char); 27 =3 extern unsigned char _chkfloat_(float); 28 =3 #if defined (__CX2__) =3 extern int abs (int); =3 extern void _illop_ (void); =3 #endif 32 =3 #if !defined (__CX2__) 33 =3 extern void _push_ (unsigned char _sfr); 34 =3 extern void _pop_ (unsigned char _sfr); 35 =3 #endif 36 =3 37 =3 #pragma RESTORE 38 =3 39 =3 #endif 40 =3 6 =2 #include "task_hal_cfg.h" 1 =3 #ifndef _TASK_HAL_CFG_H_ 2 =3 #define _TASK_HAL_CFG_H_ 3 =3 4 =3 5 =3 #include 1 =4 #ifndef _SC92F8003_H 2 =4 #define _SC92F8003_H 3 =4 4 =4 #include "SC92F8003_C.H" C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 3 1 =5 /*-------------------------------------------------------------------------- 2 =5 SC92F8003_C.H 3 =5 4 =5 C Header file for SC92F8003 microcontroller. 5 =5 Copyright (c) 2018 Shenzhen SinOne Chip Electronic CO., Ltd. 6 =5 All rights reserved. 7 =5 Ԫ΢޹˾ 8 =5 汾: V1.0 9 =5 : 2018.05.02 10 =5 --------------------------------------------------------------------------*/ 11 =5 #ifndef _SC92F8003_H_ 12 =5 #define _SC92F8003_H_ 13 =5 14 =5 /* ------------------- ֽڼĴ-------------------- */ 15 =5 ///*CPU*/ 16 =5 sfr ACC = 0xE0; //ۼ 17 =5 sfr B = 0xF0; //ͨüĴB 18 =5 sfr PSW = 0xD0; //״̬ 19 =5 sfr DPH = 0x83; //ָ8λ 20 =5 sfr DPL = 0x82; //ָ8λ 21 =5 sfr SP = 0x81; //ջָ 22 =5 23 =5 24 =5 /*system*/ 25 =5 sfr PCON = 0x87; //ԴƼĴ 26 =5 27 =5 /*interrupt*/ 28 =5 sfr IP1 = 0XB9; //жȼƼĴ1 29 =5 sfr IP = 0xB8; //жȨƼĴ 30 =5 sfr IE = 0xA8; //жϿƼĴ 31 =5 sfr IE1 = 0XA9; //жϿƼĴ1 32 =5 33 =5 /*PORT*/ 34 =5 sfr P2PH = 0xA2; //P2ģʽƼĴ 35 =5 sfr P2CON = 0xA1; //P2ģʽƼĴ 36 =5 sfr P2 = 0xA0; //P2ݼĴ 37 =5 sfr P1PH = 0x92; //P1ģʽƼĴ 38 =5 sfr P1CON = 0x91; //P1ģʽƼĴ 39 =5 sfr P1 = 0x90; //P1ݼĴ 40 =5 sfr P0PH = 0x9B; //P0ģʽƼĴ 41 =5 sfr P0CON = 0x9A; //P0ģʽƼĴ 42 =5 sfr P0 = 0x80; //P0ݼĴ 43 =5 44 =5 /*TIMER*/ 45 =5 sfr TMCON = 0x8E; //ʱƵʿƼĴ 46 =5 sfr TH1 = 0x8D; //ʱ18λ 47 =5 sfr TH0 = 0x8C; //ʱ08λ 48 =5 sfr TL1 = 0x8B; //ʱ18λ 49 =5 sfr TL0 = 0x8A; //ʱ08λ 50 =5 sfr TMOD = 0x89; //ʱģʽĴ 51 =5 sfr TCON = 0x88; //ʱƼĴ 52 =5 sfr T2CON = 0xC8; //ʱ2ƼĴ 53 =5 sfr T2MOD = 0xC9; //ʱ2ģʽĴ 54 =5 sfr RCAP2L = 0xCA; //ʱ2/׽8λ 55 =5 sfr RCAP2H = 0xCB; //ʱ2/׽8λ 56 =5 sfr TL2 = 0xCC; //ʱ28λ 57 =5 sfr TH2 = 0xCD; //ʱ28λ 58 =5 59 =5 60 =5 /*ADC*/ 61 =5 sfr ADCCFG1 = 0xAA; //ADCüĴ0 62 =5 sfr ADCCFG0 = 0xAB; //ADCüĴ1 C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 4 63 =5 sfr ADCCON = 0XAD; //ADCƼĴ 64 =5 sfr ADCVL = 0xAE; //ADC Ĵ 65 =5 sfr ADCVH = 0xAF; //ADC Ĵ 66 =5 67 =5 /*PWM*/ 68 =5 sfr PWMCFG = 0xD1; //PWMüĴ 69 =5 sfr PWMCON0 = 0xD2; //PWMƼĴ 70 =5 sfr PWMPRD = 0xD3; //PWMüĴ 71 =5 sfr PWMDTYA = 0xD4; //PWMռձüĴA 72 =5 sfr PWMDTY0 = 0xD5; //PWM0üĴ 73 =5 sfr PWMDTY1 = 0xD6; //PWM1üĴ 74 =5 sfr PWMDTY2 = 0xD7; //PWM2üĴ 75 =5 sfr PWMCON1 = 0xDA; //PWMƼĴ 76 =5 sfr PWMDTYB = 0xDB; //PWMռձüĴB 77 =5 sfr PWMDTY3 = 0xDC; //PWM3üĴ 78 =5 sfr PWMDTY4 = 0xDD; //PWM4üĴ 79 =5 sfr PWMDTY5 = 0xDE; //PWM5üĴ 80 =5 sfr PWMDTY6 = 0xDF; //PWM6üĴ 81 =5 82 =5 83 =5 // 84 =5 ///*WatchDog*/ 85 =5 sfr BTMCON = 0XCE; //ƵʱƼĴ 86 =5 sfr WDTCON = 0xCF; //WDTƼĴ 87 =5 88 =5 89 =5 sfr OTCON = 0X8F; //ƼĴ 90 =5 91 =5 /*INT*/ 92 =5 sfr INT0F = 0XBA; //INT0 ½жϿƼĴ 93 =5 sfr INT0R = 0XBB; //INT0 ϽжϿƼĴ 94 =5 sfr INT1F = 0XBC; //INT1 ½жϿƼĴ 95 =5 sfr INT1R = 0XBD; //INT1 ϽжϿƼĴ 96 =5 sfr INT2F = 0XC6; //INT2 ½жϿƼĴ 97 =5 sfr INT2R = 0XC7; //INT2 ϽжϿƼĴ 98 =5 99 =5 /*IAP */ 100 =5 sfr IAPCTL = 0xF6; //IAPƼĴ 101 =5 sfr IAPDAT = 0xF5; //IAPݼĴ 102 =5 sfr IAPADE = 0xF4; //IAPչַĴ 103 =5 sfr IAPADH = 0xF3; //IAPдַλĴ 104 =5 sfr IAPADL = 0xF2; //IAPдַ8λĴ 105 =5 sfr IAPKEY = 0xF1; //IAPĴ 106 =5 107 =5 /*uart0*/ 108 =5 sfr SCON = 0X98; //uartƼĴ 109 =5 sfr SBUF = 0X99; //uart0ݼĴ 110 =5 111 =5 /*һ*/ 112 =5 sfr SSCON0 = 0X9D; //SSIƼĴ0 113 =5 sfr SSCON1 = 0X9E; //SSIƼĴ1 114 =5 sfr SSCON2 = 0X95; //SSIƼĴ2 115 =5 sfr SSDAT = 0X9F; //SSIݼĴ 116 =5 117 =5 sfr OPINX = 0XFE; 118 =5 sfr OPREG = 0XFF; 119 =5 120 =5 /*Check Sum*/ 121 =5 sfr CHKSUML = 0XFC; //Check SumĴλ 122 =5 sfr CHKSUMH = 0XFD; //Check SumĴλ 123 =5 124 =5 sfr OPERCON = 0xEF; //ƼĴ C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 5 125 =5 126 =5 ///* ------------------- λĴ-------------------- */ 127 =5 /*PSW*/ 128 =5 sbit CY = PSW^7; //־λ 0:ӷλ޽λ߼λ޽λʱ 1:ӷλн -λ߼λнλʱ 129 =5 sbit AC = PSW^6; //λ־λ 0:޽λλ 1:ӷʱbit3λнλbit3λн -λʱ 130 =5 sbit F0 = PSW^5; //û־λ 131 =5 sbit RS1 = PSW^4; //Ĵѡλ 132 =5 sbit RS0 = PSW^3; //Ĵѡλ 133 =5 sbit OV = PSW^2; //־λ 134 =5 sbit F1 = PSW^1; //F1־ 135 =5 sbit P = PSW^0; //ż־λ 0:ACC1ĸΪż0 1:ACC1ĸΪ 136 =5 137 =5 /*T2CON*/ 138 =5 sbit TF2 = T2CON^7; 139 =5 sbit EXF2 = T2CON^6; 140 =5 sbit RCLK = T2CON^5; 141 =5 sbit TCLK = T2CON^4; 142 =5 sbit EXEN2 = T2CON^3; 143 =5 sbit TR2 = T2CON^2; 144 =5 sbit T2 = T2CON^1; 145 =5 sbit CP = T2CON^0; 146 =5 147 =5 148 =5 /*IP*/ 149 =5 sbit IPADC = IP^6; //ADCжȿλ 0:趨 ADCжȨ ͡ 1:趨 ADCжȨ ߡ - 150 =5 sbit IPT2 = IP^5; //PWMжȿλ 0:趨 PWMжȨ ͡ 1:趨 PWM жȨ - 151 =5 sbit IPUART = IP^4; //SIFжȿλ 0:趨 SIFжȨ ͡ 1:趨 SIFжȨ ߡ - 152 =5 sbit IPT1 = IP^3; //Timer1жȿλ 0:趨 Timer 1жȨ ͡ 1:趨 Timer 1ж - ߡ 153 =5 sbit IPINT1 = IP^2; //32K Base Timerжȿλ 0:趨 32KжȨ ͡ 1:趨 32Kж -Ȩ ߡ 154 =5 sbit IPT0 = IP^1; //Timer0жȿλ 0:趨 Timer 0жȨ ͡ 1:趨 Timer 0ж - ߡ 155 =5 sbit IPINT0 = IP^0; 156 =5 157 =5 /*IE*/ 158 =5 sbit EA = IE^7; //жʹܵܿ 0:رеж 1:еж 159 =5 sbit EADC = IE^6; //ADCжʹܿ 0:رADCж 1:ADCж 160 =5 sbit ET2 = IE^5; //PWMжʹܿ 0:رPWMж 1:PWMж 161 =5 sbit EUART = IE^4; //UARTжʹܿ 0:رSIFж 1:SIFж 162 =5 sbit ET1 = IE^3; //Timer1жʹܿ 0:رTIMER1ж 1:TIMER1ж 163 =5 sbit EINT1 = IE^2; //32K Base Timerжʹܿ 0:ر32Kж 1:32Kж 164 =5 sbit ET0 = IE^1; //Timer0жʹܿ 0:رTIMER0ж 1:TIMER0ж 165 =5 sbit EINT0 = IE^0; //TouchKeyжʹܿ 0:رTouchKeyж 1:TouchKeyж 166 =5 167 =5 /*TCON*/ 168 =5 sbit TF1 = TCON^7; //T1ж־λ T1жʱӲTF1Ϊ1жϣCPU -ӦʱӲ塰0 169 =5 sbit TR1 = TCON^6; //ʱT1пλ 0:Timer1ֹ 1:Timer1ʼ 170 =5 sbit TF0 = TCON^5; //T0ж־λ T0жʱӲTF0Ϊ1жϣCPU -ӦʱӲ塰0 171 =5 sbit TR0 = TCON^4; //ʱT0пλ 0:Timer0ֹ 1:Timer0ʼ 172 =5 173 =5 /*SCON*/ 174 =5 sbit SM0 = SCON^7; 175 =5 sbit SM1 = SCON^6; 176 =5 sbit SM2 = SCON^5; C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 6 177 =5 sbit REN = SCON^4; 178 =5 sbit TB8 = SCON^3; 179 =5 sbit RB8 = SCON^2; 180 =5 sbit TI = SCON^1; 181 =5 sbit RI = SCON^0; 182 =5 183 =5 /* P0 */ 184 =5 sbit P01 = P0^1; 185 =5 sbit P00 = P0^0; 186 =5 187 =5 /* P1 */ 188 =5 sbit P17 = P1^7; 189 =5 sbit P16 = P1^6; 190 =5 sbit P15 = P1^5; 191 =5 sbit P14 = P1^4; 192 =5 sbit P13 = P1^3; 193 =5 sbit P12 = P1^2; 194 =5 sbit P11 = P1^1; 195 =5 sbit P10 = P1^0; 196 =5 197 =5 /* P2 */ 198 =5 sbit P27 = P2^7; 199 =5 sbit P26 = P2^6; 200 =5 sbit P25 = P2^5; 201 =5 sbit P24 = P2^4; 202 =5 sbit P23 = P2^3; 203 =5 sbit P22 = P2^2; 204 =5 sbit P21 = P2^1; 205 =5 sbit P20 = P2^0; 206 =5 207 =5 #endif 5 =4 6 =4 #define enableInterrupts() EA=1 /** ж **/ 7 =4 #define disableInterrupts() EA=0 /** رж **/ 8 =4 9 =4 #define __I volatile const /*!< defines 'read only' permissions */ 10 =4 #define __O volatile /*!< defines 'write only' permissions */ 11 =4 #define __IO volatile /*!< defines 'read / write' permissions */ 12 =4 13 =4 /*!< Signed integer types */ 14 =4 typedef signed char int8_t; 15 =4 typedef signed short int16_t; 16 =4 typedef signed long int32_t; 17 =4 18 =4 /*!< Unsigned integer types */ 19 =4 typedef unsigned char uint8_t; 20 =4 typedef unsigned short uint16_t; 21 =4 typedef unsigned long uint32_t; 22 =4 23 =4 typedef int32_t s32; 24 =4 typedef int16_t s16; 25 =4 typedef int8_t s8; 26 =4 27 =4 typedef uint32_t u32; 28 =4 typedef uint16_t u16; 29 =4 typedef uint8_t u8; 30 =4 31 =4 32 =4 typedef enum {FALSE = 0, TRUE = !FALSE} bool; 33 =4 34 =4 typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus; 35 =4 C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 7 36 =4 typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; 37 =4 38 =4 typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; 39 =4 40 =4 typedef enum {LOW = 0, HIGH = !LOW} PriorityStatus; 41 =4 42 =4 #endif 6 =3 7 =3 #define INT_EXT0 0 8 =3 #define INT_T0 1 9 =3 #define INT_EXT1 2 10 =3 #define INT_T1 3 11 =3 #define INT_UART0 4 12 =3 #define INT_T2 5 13 =3 #define INT_ADC 6 14 =3 #define INT_SSI 7 15 =3 #define INT_PWM 8 16 =3 #define INT_BTM 9 17 =3 #define INT_EXT2 10 18 =3 19 =3 20 =3 21 =3 #endif 7 =2 #include "pt.h" 1 =3 2 =3 #ifndef __PT_H__ 3 =3 #define __PT_H__ 4 =3 5 =3 #include "lc.h" 1 =4 #ifndef __LC_H__ 2 =4 #define __LC_H__ 3 =4 4 =4 5 =4 #ifdef LC_INCLUDE =4 #include LC_INCLUDE =4 #else 8 =4 #include "lc-switch.h" 1 =5 2 =5 3 =5 #ifndef __LC_SWITCH_H__ 4 =5 #define __LC_SWITCH_H__ 5 =5 6 =5 typedef unsigned short lc_t; 7 =5 8 =5 #define LC_INIT(s) s = 0; 9 =5 10 =5 #define LC_RESUME(s) switch(s) { case 0: 11 =5 12 =5 #define LC_SET(s) s = __LINE__; case __LINE__: 13 =5 14 =5 #define LC_END(s) } 15 =5 16 =5 #endif /* __LC_SWITCH_H__ */ 17 =5 18 =5 /** @} */ 9 =4 #endif 10 =4 11 =4 #endif 6 =3 7 =3 struct pt { 8 =3 lc_t lc; 9 =3 }; C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 8 10 =3 11 =3 12 =3 #ifndef UNUSED_PARAM 13 =3 #define UNUSED_PARAM(v) (void)(v) 14 =3 #endif 15 =3 16 =3 #define PT_WAITING 0 //等待 17 =3 #define PT_YIELDED 1 //锁死线程 18 =3 #define PT_EXITED 2 //退出 19 =3 #define PT_ENDED 3 //结束 20 =3 21 =3 #define PT_INIT(pt) LC_INIT((pt)->lc) 22 =3 #define PT_THREAD(name_args) int8_t name_args 23 =3 #define PT_BEGIN(pt) { int8_t PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) 24 =3 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ 25 =3 UNUSED_PARAM(PT_YIELD_FLAG );\ 26 =3 PT_INIT(pt); return PT_ENDED; } 27 =3 28 =3 29 =3 //等待条件成立,如果不成立,继续等待 30 =3 #define PT_WAIT_UNTIL(pt, condition) \ 31 =3 do { \ 32 =3 LC_SET((pt)->lc); \ 33 =3 if(!(condition)) { \ 34 =3 return PT_WAITING; \ 35 =3 } \ 36 =3 } while(0) 37 =3 38 =3 //一直等待,直到条件不成立 39 =3 #define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) 40 =3 //等待子线程退出 41 =3 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) 42 =3 43 =3 //启动子线程,等待子线程退出,如果不退出,在此阻塞 44 =3 #define PT_SPAWN(pt, child, thread) \ 45 =3 do { \ 46 =3 PT_INIT((child)); \ 47 =3 PT_WAIT_THREAD((pt), (thread)); \ 48 =3 } while(0) 49 =3 50 =3 //重新启动线程,从头开始 51 =3 #define PT_RESTART(pt) \ 52 =3 do { \ 53 =3 PT_INIT(pt); \ 54 =3 return PT_WAITING; \ 55 =3 } while(0) 56 =3 57 =3 //退出线程 58 =3 #define PT_EXIT(pt) \ 59 =3 do { \ 60 =3 PT_INIT(pt); \ 61 =3 return PT_EXITED; \ 62 =3 } while(0) 63 =3 //子线程是否退出 64 =3 #define PT_SCHEDULE(f) ((f) < PT_EXITED) 65 =3 66 =3 //锁死任务 67 =3 #define PT_YIELD(pt) \ 68 =3 do { \ 69 =3 PT_YIELD_FLAG = 0; \ 70 =3 LC_SET((pt)->lc); \ 71 =3 if(PT_YIELD_FLAG == 0) { \ C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 9 72 =3 return PT_YIELDED; \ 73 =3 } \ 74 =3 } while(0) 75 =3 76 =3 //锁死任务直到符合条件 77 =3 #define PT_YIELD_UNTIL(pt, cond) \ 78 =3 do { \ 79 =3 PT_YIELD_FLAG = 0; \ 80 =3 LC_SET((pt)->lc); \ 81 =3 if((PT_YIELD_FLAG == 0) || !(cond)) { \ 82 =3 return PT_YIELDED; \ 83 =3 } \ 84 =3 } while(0) 85 =3 86 =3 87 =3 #endif /* __PT_H__ */ 8 =2 9 =2 #define GPIOR GPIO1 10 =2 #define GPIOG GPIO2 11 =2 #define GPIOB GPIO2 12 =2 #define GPIOC GPIO2 13 =2 #define GPIOW GPIO2 14 =2 15 =2 #define LEDR GPIO_PIN_0 16 =2 #define LEDG GPIO_PIN_7 17 =2 #define LEDB GPIO_PIN_6 18 =2 #define LEDC GPIO_PIN_5 19 =2 #define LEDW GPIO_PIN_4 20 =2 21 =2 22 =2 typedef void (* func )(void); 23 =2 24 =2 void Idle(void); 25 =2 void Init(void); 26 =2 void InitWdt(void); 27 =2 void InitPort(void); 28 =2 29 =2 void SysTick_Handler(void); 30 =2 void Task_SysTick_Handler(void); 31 =2 32 =2 PT_THREAD(TaskBlinLed(struct pt *pt1 )); 33 =2 PT_THREAD(TaskWDT(struct pt *pt1 )); 34 =2 35 =2 36 =2 37 =2 #endif 7 =1 8 =1 #include "pt_thread/pt_header.h" 1 =2 #ifndef _PT_HEADER_H_ 2 =2 #define _PT_HEADER_H_ 3 =2 4 =2 #include "pt_timer.h" 1 =3 #ifndef _PT_TIMER_H_ 2 =3 #define _PT_TIMER_H_ 3 =3 #include "pt.h" 1 =4 2 =4 #ifndef __PT_H__ =4 #define __PT_H__ =4 =4 #include "lc.h" =4 =4 struct pt { C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 10 =4 lc_t lc; =4 }; =4 =4 =4 #ifndef UNUSED_PARAM =4 #define UNUSED_PARAM(v) (void)(v) =4 #endif =4 =4 #define PT_WAITING 0 //等待 =4 #define PT_YIELDED 1 //锁死线程 =4 #define PT_EXITED 2 //退出 =4 #define PT_ENDED 3 //结束 =4 =4 #define PT_INIT(pt) LC_INIT((pt)->lc) =4 #define PT_THREAD(name_args) int8_t name_args =4 #define PT_BEGIN(pt) { int8_t PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) =4 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ =4 UNUSED_PARAM(PT_YIELD_FLAG );\ =4 PT_INIT(pt); return PT_ENDED; } =4 =4 =4 //等待条件成立,如果不成立,继续等待 =4 #define PT_WAIT_UNTIL(pt, condition) \ =4 do { \ =4 LC_SET((pt)->lc); \ =4 if(!(condition)) { \ =4 return PT_WAITING; \ =4 } \ =4 } while(0) =4 =4 //一直等待,直到条件不成立 =4 #define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) =4 //等待子线程退出 =4 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) =4 =4 //启动子线程,等待子线程退出,如果不退出,在此阻塞 =4 #define PT_SPAWN(pt, child, thread) \ =4 do { \ =4 PT_INIT((child)); \ =4 PT_WAIT_THREAD((pt), (thread)); \ =4 } while(0) =4 =4 //重新启动线程,从头开始 =4 #define PT_RESTART(pt) \ =4 do { \ =4 PT_INIT(pt); \ =4 return PT_WAITING; \ =4 } while(0) =4 =4 //退出线程 =4 #define PT_EXIT(pt) \ =4 do { \ =4 PT_INIT(pt); \ =4 return PT_EXITED; \ =4 } while(0) =4 //子线程是否退出 =4 #define PT_SCHEDULE(f) ((f) < PT_EXITED) =4 =4 //锁死任务 =4 #define PT_YIELD(pt) \ =4 do { \ =4 PT_YIELD_FLAG = 0; \ C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 11 =4 LC_SET((pt)->lc); \ =4 if(PT_YIELD_FLAG == 0) { \ =4 return PT_YIELDED; \ =4 } \ =4 } while(0) =4 =4 //锁死任务直到符合条件 =4 #define PT_YIELD_UNTIL(pt, cond) \ =4 do { \ =4 PT_YIELD_FLAG = 0; \ =4 LC_SET((pt)->lc); \ =4 if((PT_YIELD_FLAG == 0) || !(cond)) { \ =4 return PT_YIELDED; \ =4 } \ =4 } while(0) =4 =4 =4 #endif /* __PT_H__ */ 4 =3 5 =3 6 =3 struct timer { 7 =3 unsigned long start; //记录启动时的tick值 8 =3 unsigned long interval; //要定时的tick数 9 =3 }; 10 =3 11 =3 void timer_set(struct timer *t, unsigned long interval); 12 =3 unsigned char timer_expired(struct timer *t); 13 =3 14 =3 #endif 5 =2 #include "pt-sem.h" 1 =3 /* 2 =3 #include "pt-sem.h" 3 =3 4 =3 #define NUM_ITEMS 32 5 =3 #define BUFSIZE 8 6 =3 7 =3 static struct pt_sem mutex, full, empty; 8 =3 9 =3 PT_THREAD(producer(struct pt *pt)) 10 =3 { 11 =3 static int produced; 12 =3 13 =3 PT_BEGIN(pt); 14 =3 15 =3 for(produced = 0; produced < NUM_ITEMS; ++produced) { 16 =3 17 =3 PT_SEM_WAIT(pt, &full); 18 =3 19 =3 PT_SEM_WAIT(pt, &mutex); 20 =3 add_to_buffer(produce_item()); 21 =3 PT_SEM_SIGNAL(pt, &mutex); 22 =3 23 =3 PT_SEM_SIGNAL(pt, &empty); 24 =3 } 25 =3 26 =3 PT_END(pt); 27 =3 } 28 =3 29 =3 PT_THREAD(consumer(struct pt *pt)) 30 =3 { 31 =3 static int consumed; 32 =3 C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 12 33 =3 PT_BEGIN(pt); 34 =3 35 =3 for(consumed = 0; consumed < NUM_ITEMS; ++consumed) { 36 =3 37 =3 PT_SEM_WAIT(pt, &empty); 38 =3 39 =3 PT_SEM_WAIT(pt, &mutex); 40 =3 consume_item(get_from_buffer()); 41 =3 PT_SEM_SIGNAL(pt, &mutex); 42 =3 43 =3 PT_SEM_SIGNAL(pt, &full); 44 =3 } 45 =3 46 =3 PT_END(pt); 47 =3 } 48 =3 49 =3 PT_THREAD(driver_thread(struct pt *pt)) 50 =3 { 51 =3 static struct pt pt_producer, pt_consumer; 52 =3 53 =3 PT_BEGIN(pt); 54 =3 55 =3 PT_SEM_INIT(&empty, 0); 56 =3 PT_SEM_INIT(&full, BUFSIZE); 57 =3 PT_SEM_INIT(&mutex, 1); 58 =3 59 =3 PT_INIT(&pt_producer); 60 =3 PT_INIT(&pt_consumer); 61 =3 62 =3 PT_WAIT_THREAD(pt, producer(&pt_producer) & 63 =3 consumer(&pt_consumer)); 64 =3 65 =3 PT_END(pt); 66 =3 } 67 =3 */ 68 =3 69 =3 #ifndef __PT_SEM_H__ 70 =3 #define __PT_SEM_H__ 71 =3 72 =3 #include "pt.h" 1 =4 2 =4 #ifndef __PT_H__ =4 #define __PT_H__ =4 =4 #include "lc.h" =4 =4 struct pt { =4 lc_t lc; =4 }; =4 =4 =4 #ifndef UNUSED_PARAM =4 #define UNUSED_PARAM(v) (void)(v) =4 #endif =4 =4 #define PT_WAITING 0 //等待 =4 #define PT_YIELDED 1 //锁死线程 =4 #define PT_EXITED 2 //退出 =4 #define PT_ENDED 3 //结束 =4 =4 #define PT_INIT(pt) LC_INIT((pt)->lc) =4 #define PT_THREAD(name_args) int8_t name_args C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 13 =4 #define PT_BEGIN(pt) { int8_t PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) =4 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ =4 UNUSED_PARAM(PT_YIELD_FLAG );\ =4 PT_INIT(pt); return PT_ENDED; } =4 =4 =4 //等待条件成立,如果不成立,继续等待 =4 #define PT_WAIT_UNTIL(pt, condition) \ =4 do { \ =4 LC_SET((pt)->lc); \ =4 if(!(condition)) { \ =4 return PT_WAITING; \ =4 } \ =4 } while(0) =4 =4 //一直等待,直到条件不成立 =4 #define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) =4 //等待子线程退出 =4 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) =4 =4 //启动子线程,等待子线程退出,如果不退出,在此阻塞 =4 #define PT_SPAWN(pt, child, thread) \ =4 do { \ =4 PT_INIT((child)); \ =4 PT_WAIT_THREAD((pt), (thread)); \ =4 } while(0) =4 =4 //重新启动线程,从头开始 =4 #define PT_RESTART(pt) \ =4 do { \ =4 PT_INIT(pt); \ =4 return PT_WAITING; \ =4 } while(0) =4 =4 //退出线程 =4 #define PT_EXIT(pt) \ =4 do { \ =4 PT_INIT(pt); \ =4 return PT_EXITED; \ =4 } while(0) =4 //子线程是否退出 =4 #define PT_SCHEDULE(f) ((f) < PT_EXITED) =4 =4 //锁死任务 =4 #define PT_YIELD(pt) \ =4 do { \ =4 PT_YIELD_FLAG = 0; \ =4 LC_SET((pt)->lc); \ =4 if(PT_YIELD_FLAG == 0) { \ =4 return PT_YIELDED; \ =4 } \ =4 } while(0) =4 =4 //锁死任务直到符合条件 =4 #define PT_YIELD_UNTIL(pt, cond) \ =4 do { \ =4 PT_YIELD_FLAG = 0; \ =4 LC_SET((pt)->lc); \ =4 if((PT_YIELD_FLAG == 0) || !(cond)) { \ =4 return PT_YIELDED; \ =4 } \ =4 } while(0) C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 14 =4 =4 =4 #endif /* __PT_H__ */ 73 =3 74 =3 struct pt_sem { 75 =3 unsigned int count; 76 =3 }; 77 =3 78 =3 //信号量 79 =3 #define PT_SEM_INIT(s, c) (s)->count = c 80 =3 81 =3 //信号量等待 当信号量大于0 时继续,否则等待 82 =3 #define PT_SEM_WAIT(pt, s) \ 83 =3 do { \ 84 =3 PT_WAIT_UNTIL(pt, (s)->count > 0); \ 85 =3 --(s)->count; \ 86 =3 } while(0) 87 =3 88 =3 //写入信号量 89 =3 #define PT_SEM_SIGNAL(pt, s) ++(s)->count 90 =3 91 =3 #endif /* __PT_SEM_H__ */ 92 =3 93 =3 /** @} */ 94 =3 /** @} */ 95 =3 6 =2 7 =2 #endif 8 =2 9 =1 10 =1 11 =1 12 =1 #define TASK_ID(FUNC) TASK_ID_##FUNC 13 =1 #define TASK_NAME(FUNC) #FUNC 14 =1 15 =1 #ifndef UNUSED_PARAM =1 #define UNUSED_PARAM(p) (void)(p) =1 #endif 18 =1 19 =1 20 =1 #ifndef NULL 21 =1 #define NULL (void*)0 22 =1 #endif 23 =1 24 =1 25 =1 #ifndef UNUSED 26 =1 #define UNUSED(x) (void)(x) 27 =1 #endif 28 =1 29 =1 #ifdef __cplusplus =1 extern "C" { =1 #endif 32 =1 33 =1 34 =1 35 =1 enum TASK_ID { 36 =1 TASK_ID(TaskTimer), 37 =1 #include "cfg/taskid.h" 1 =2 TASK_ID(TaskBlinLed), 2 =2 TASK_ID(TaskWDT), 3 =2 TASK_ID(TaskLMM), 4 =2 TASK_ID(TaskEX_WDT), C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 15 5 =2 TASK_ID(TaskCAN), 6 =2 7 =2 38 =1 }; 39 =1 40 =1 41 =1 42 =1 enum TASK_MODE 43 =1 { 44 =1 TASK_MODE_ONCE, 45 =1 TASK_MODE_PERIOD 46 =1 }; 47 =1 48 =1 enum TIMER_MODE 49 =1 { 50 =1 TIMER_MODE_TIMER = 0, 51 =1 TIMER_MODE_ONCEROUTINE, 52 =1 TIMER_MODE_CYCROUTINE 53 =1 }; 54 =1 55 =1 void InitT0(void); 56 =1 void InitTask(void); 57 =1 void TaskProc(void); 58 =1 59 =1 60 =1 int8_t ActiveTask(int8_t cTaskID, int32_t lPeriod); 61 =1 int8_t SuspendTask(int8_t cTaskID); 62 =1 63 =1 void ActiveTaskNow(int8_t cTaskID, int32_t lPeriod); 64 =1 int8_t SetTaskLastTime(int8_t cTaskID,int32_t lLastTime); 65 =1 66 =1 67 =1 int8_t StartTimer2(int8_t *TimerID,int8_t cMode,uint32_t lPeriod,void (* routine)(void * Param1),void * - Param1); 68 =1 int8_t StartTimer( int8_t cMode,int32_t lPeriod,void (* routine)(void * Param1),void * - Param1); 69 =1 int8_t StopTimer ( int8_t * pcTimerNumber ); 70 =1 void StopAllTimer(void); 71 =1 72 =1 uint32_t get_system_ms(void); 73 =1 //////////////// 74 =1 75 =1 #ifdef __cplusplus =1 } =1 #endif 78 =1 #endif 79 =1 2 3 //#include "stdint.h" 4 #include "task_hal.h" 1 =1 #ifndef _TASK_HAL_H_ =1 #define _TASK_HAL_H_ =1 =1 =1 #include "intrins.h" =1 #include "task_hal_cfg.h" =1 #include "pt.h" =1 =1 #define GPIOR GPIO1 =1 #define GPIOG GPIO2 =1 #define GPIOB GPIO2 =1 #define GPIOC GPIO2 C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 16 =1 #define GPIOW GPIO2 =1 =1 #define LEDR GPIO_PIN_0 =1 #define LEDG GPIO_PIN_7 =1 #define LEDB GPIO_PIN_6 =1 #define LEDC GPIO_PIN_5 =1 #define LEDW GPIO_PIN_4 =1 =1 =1 typedef void (* func )(void); =1 =1 void Idle(void); =1 void Init(void); =1 void InitWdt(void); =1 void InitPort(void); =1 =1 void SysTick_Handler(void); =1 void Task_SysTick_Handler(void); =1 =1 PT_THREAD(TaskBlinLed(struct pt *pt1 )); =1 PT_THREAD(TaskWDT(struct pt *pt1 )); =1 =1 =1 =1 #endif 5 #include "task_type.h" 1 =1 #ifndef _TASK_TYPE_H_ 2 =1 #define _TASK_TYPE_H_ 3 =1 4 =1 #define TASK_WITH_PT 1 5 =1 // 6 =1 typedef struct mytask 7 =1 { 8 =1 int8_t cActive; // 9 =1 int8_t cMode; 10 =1 int8_t cTaskID; // 11 =1 int8_t reserve; // 12 =1 // int8_t cTaskName[TASK_NAME_LEN]; 13 =1 int32_t lLastTime; 14 =1 int32_t lPeriod; // 15 =1 #if(TASK_WITH_PT) 16 =1 int8_t (*TaskProc)(struct pt* pt1); // 17 =1 #else =1 void (*TaskProc)(void); // =1 #endif 20 =1 struct pt pt1; 21 =1 }TASK_DATA,*PTASK_DATA; 22 =1 23 =1 // define timer data struct 24 =1 typedef struct mytimer 25 =1 { 26 =1 int8_t cUse; 27 =1 int8_t *TimerID; 28 =1 int8_t cMode; // timer work mode 29 =1 int8_t reserve1; 30 =1 31 =1 int32_t lPeriod; // timer period, unit=10ms. 32 =1 int32_t lLastTime; // timer count for reload 33 =1 void (*routine)(void * Param1); // user's timer routine 34 =1 void *Param1; 35 =1 }TIMER_DATA,*PTIMER_DATA; 36 =1 C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 17 37 =1 38 =1 #endif 6 #include "string.h" 1 =1 /*-------------------------------------------------------------------------- 2 =1 STRING.H 3 =1 4 =1 String functions. 5 =1 Copyright (c) 1988-2008 Keil Elektronik GmbH and Keil Software, Inc. 6 =1 Copyright (c) 2008-2016 ARM Germany GmbH 7 =1 All rights reserved. 8 =1 --------------------------------------------------------------------------*/ 9 =1 10 =1 #ifndef __STRING_H__ 11 =1 #define __STRING_H__ 12 =1 13 =1 #ifndef _SIZE_T 14 =1 #define _SIZE_T 15 =1 typedef unsigned int size_t; 16 =1 #endif 17 =1 18 =1 #ifndef NULL =1 #define NULL ((void *)0) =1 #endif 21 =1 22 =1 #pragma SAVE 23 =1 #pragma REGPARMS 24 =1 extern char *strcat (char *s1, const char *s2); 25 =1 extern char *strncat (char *s1, const char *s2, size_t n); 26 =1 27 =1 extern char strcmp (const char *s1, const char *s2); 28 =1 extern char strncmp (const char *s1, const char *s2, size_t n); 29 =1 30 =1 extern char *strcpy (char *s1, const char *s2); 31 =1 extern char *strncpy (char *s1, const char *s2, size_t n); 32 =1 33 =1 extern size_t strlen (const char *); 34 =1 35 =1 extern char *strchr (const char *s, char c); 36 =1 extern int strpos (const char *s, char c); 37 =1 extern char *strrchr (const char *s, char c); 38 =1 extern int strrpos (const char *s, char c); 39 =1 40 =1 extern size_t strspn (const char *s, const char *set); 41 =1 extern size_t strcspn (const char *s, const char *set); 42 =1 extern char *strpbrk (const char *s, const char *set); 43 =1 extern char *strrpbrk(const char *s, const char *set); 44 =1 extern char *strstr (const char *s, const char *sub); 45 =1 extern char *strtok (char *str, const char *set); 46 =1 47 =1 extern char memcmp (const void *s1, const void *s2, size_t n); 48 =1 extern void *memcpy (void *s1, const void *s2, size_t n); 49 =1 extern void *memchr (const void *s, char val, size_t n); 50 =1 extern void *memccpy (void *s1, const void *s2, char val, size_t n); 51 =1 extern void *memmove (void *s1, const void *s2, size_t n); 52 =1 extern void *memset (void *s, char val, size_t n); 53 =1 #pragma RESTORE 54 =1 55 =1 #endif 7 #include "cfg/task_header.h" 1 =1 #ifndef _TASK_HEADER_H 2 =1 #define _TASK_HEADER_H 3 =1 C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 18 4 =1 #include "task_hal.h" 1 =2 #ifndef _TASK_HAL_H_ =2 #define _TASK_HAL_H_ =2 =2 =2 #include "intrins.h" =2 #include "task_hal_cfg.h" =2 #include "pt.h" =2 =2 #define GPIOR GPIO1 =2 #define GPIOG GPIO2 =2 #define GPIOB GPIO2 =2 #define GPIOC GPIO2 =2 #define GPIOW GPIO2 =2 =2 #define LEDR GPIO_PIN_0 =2 #define LEDG GPIO_PIN_7 =2 #define LEDB GPIO_PIN_6 =2 #define LEDC GPIO_PIN_5 =2 #define LEDW GPIO_PIN_4 =2 =2 =2 typedef void (* func )(void); =2 =2 void Idle(void); =2 void Init(void); =2 void InitWdt(void); =2 void InitPort(void); =2 =2 void SysTick_Handler(void); =2 void Task_SysTick_Handler(void); =2 =2 PT_THREAD(TaskBlinLed(struct pt *pt1 )); =2 PT_THREAD(TaskWDT(struct pt *pt1 )); =2 =2 =2 =2 #endif 5 =1 #endif 6 =1 8 9 #ifdef __cplusplus extern "C" { #endif 12 13 14 15 16 17 // function prototype 18 AL_STATIC int8_t TaskTimer(struct pt *pt1); 19 20 21 22 23 AL_STATIC xdata TASK_DATA TaskDb[]={ 24 {1, TASK_MODE_PERIOD, TASK_ID(TaskTimer), 0, 1L, 1L, TaskTimer,0} , // TASK_NAME(TaskTim -er), 25 #include "cfg/task_container.h" 1 =1 2 =1 {1, TASK_MODE_PERIOD, TASK_ID(TaskBlinLed), 0, 100L, 100L, TaskBlinLed, {0}} , // TASK_NAME( -TaskBlinLed), C51 COMPILER V9.60.7.0 TASK 05/13/2024 00:07:49 PAGE 19 3 =1 {1, TASK_MODE_PERIOD, TASK_ID(TaskWDT), 0, 100L, 100L, TaskWDT, {0}} , // TASK_NAME( -TaskWDT), 4 =1 5 =1 26 }; 27 28 29 30 31 AL_STATIC xdata TIMER_DATA TimerData[MAX_TIMER]; 32 AL_STATIC idata volatile uint8_t TMP1msCount = 0; 33 AL_STATIC idata uint32_t AllTickCount = 0; 34 35 36 37 void TaskProc (void) 38 { 39 1 while(1) 40 1 { 41 2 if(!TMP1msCount) 42 2 { 43 3 Idle(); 44 3 } 45 2 else 46 2 { 47 3 uint8_t ret = 0; 48 3 uint8_t i = 0; 49 3 for(i=0;i=MAX_TIMER || *pcTimerNumber==-1) 221 1 return -1; // timer number error 222 1 223 1 TimerData[*pcTimerNumber].cUse=0; 224 1 *pcTimerNumber = -1; 225 1 226 1 return 0; 227 1 } 228 /********************************************************************************************************* -** 229 FUNCTION: StopAllTimer 230 PURPOSE: stop all timer count 231 ********************************************************************************************************** -**/ 232 void StopAllTimer(void) 233 { 234 1 unsigned char i; 235 1 memset(TimerData,0,sizeof(TimerData)); 236 1 for(i=0;i