/********************************************************************** RTOS底层接口函数头文件 **********************************************************************/ #ifndef __OS_TASK_H #define __OS_TASK_H #include "type.h" //#include "FreeRTOS.h" //#include "queue.h" //#include "task.h" #include "config.h" #include "isys_config.h" #define WATCHDOG_ENABLE (0) #define TASK_CHK_ENABLE (1) #define USE_LCD_MOUDLE (1) #define USE_WEB_MODULE (1) //@TMP_NOT_USED //#define USE_LOG_MODULE (1) #define OS_TICKS_PER_SEC (configTICK_RATE_HZ) #define OS_WAIT_FOREVER (portMAX_DELAY) #define OS_PER_TICK_MS (portTICK_RATE_MS) #define OS_TASK_OK (0) #define OS_TASK_MAX_ABNORMAL_TIME (30) //异常最大允许时间 #define OS_MSG_MAGIC_WORD (0X5533) #define OS_MSG_ISR_TASK_ID (0XFF) //自定义的中断的任务ID #define USE_MSG_DEBUG 0 //是否启用消息debug模式 #define USE_MEM_DEBUG 1 #define MAX_TIMER_NUM 10 #define ERR_NO_ERR 0 #define ERR_CREATE_TASK_FAILED 1 #define ERR_INVALID_PARA 2 #define ERR_INVALID_POINTER 3 #define ERR_TASKID_TOO_LARGE 4 #define ERR_NO_MEM 5 #define ERR_CREATE_QUEUE_FAILED 6 #define ERR_SEND_MSG_FAILED 7 #define ERR_SEM_PTR_INVALID 8 #define ERR_POST_SEM_FAILED 9 #define ERR_PEND_SEM_FAILED 10 #define ERR_MUTEX_PTR_INVALID 11 #define ERR_TAKE_MUTEX_FAILED 12 #define ERR_GIVE_MUTEX_FAILED 13 #define ERR_I2C_NUM_ERR 14 #define ERR_SPI_NUM_ERR 15 #define ERR_CREATE_SEM_FAILED 16 #define ERR_CREATE_MUTEX_FAILED 17 typedef void * SEM_HANDLE; typedef void * MUTEX_HANDLE; typedef uint32 HANDLE; #define USE_DEBUG_UART 0 //串口调试信息开关 提交版本库时,本值必须为0 #if USE_DEBUG_UART //串口信息调试,可直接调用printf打印输出 #define DEBUG_UART 1 #endif /* #if USE_DEBUG_UART extern int printf(const char *,...); #else #include "stdio.h" #define printf(p,...) //若没开启调试模式,printf定义为空 #endif */ /* typedef struct { uint16 type; uint16 need_free; //若为申请消息,此位不要用,默认已填充释放标记 uint16 wPara; uint16 rPara; uint32 lPara; }MSG,*pMSG;*/ typedef struct { MSG msg; uint16 magci_word; uint8 alloc_id; uint8 rec_id; }MSG_DEBUG; typedef struct { uint32 tick; uint32 size; }MEM_DEBUG_HEADER; typedef struct { #if USE_MEM_DEBUG MEM_DEBUG_HEADER header; #endif uint8 mem[1]; }MEM_PTR; #define MAX_TASK 16 //当前用户层任务上限 不包含以太网以及系统任务 //数组下标为task_id typedef struct { uint32 num; uint8 created[MAX_TASK]; //任务是否建立标识 uint8 status[MAX_TASK]; uint8 pause[MAX_TASK]; //暂停时间长度,单位 秒 uint8 ignore_chk[MAX_TASK]; //忽略检查,特殊任务使用 xQueueHandle queue[MAX_TASK]; }SYS_TASK,*pSYS_TASK; typedef struct { uint32 isr_send_num; uint32 task_send_num; uint32 isr_alloc_num; uint32 task_alloc_num; uint32 free_num; }S_MSG_STATE; typedef struct { uint32 used; uint32 total; }S_MEM_STATE; typedef struct { uint32 min_num; uint32 min_msg_q[MAX_TASK]; uint32 sec_num; uint32 sec_msg_q[MAX_TASK]; //依次存放配置的任务ID }TIME_MSG_Q; typedef struct { //待扩展 uint32 reset_total_time; S_SYS_TIME close_time; #if USE_LCD_MOUDLE uint8 os_log[1]; #endif }S_BACKUP_MEM; //持续按键,等待间隔 #define KEY_DELAY_TIME (300) #define TMR_IDLE 0 #define TMR_RUN 1 #define TMR_STOP 2 #define TMR_TYPE_ONE 0 #define TMR_TYPE_CYCLE 1 #define MSG_NEED_FREE (0x55) #define MSG_NO_NEED_FREE (0xaa) #define MSG_NEED_TO_FREE(pmsg) (pmsg->need_free==MSG_NEED_FREE) enum{RET_OK = 0,RET_ERR,RET_NO_MEM,RET_NOT_FIND,RET_RET_ERR,RET_WRITE_FAIL,RET_READ_FAIL}; typedef struct __TIMER { uint32 state; uint32 ticks; uint32 count; uint32 type; uint32 task_id; //由创建该消息的接收 MSG msg; }TIMER,*PTIMER; typedef enum { MSG_RS232 = 0x10, MSG_ETH, MSG_SEC, MSG_MINUTE, MSG_WRITE_PARA, MSG_READ_PARA, MSG_KEY, MSG_TIMER, MSG_UPGRADE, MSG_HTTP_UPDATE, //http发送给液晶做update校正, MSG_WEB_SAVE_PARA, MSG_FPGA_UPGRADE,//MSG_FPGA_UPGRADE_OVER MSG_UDP_ALRM, MSG_UART_ALRM, MSG_LOG, MSG_LOG_RECORD_RESET, MSG_UART_RE_INIT, MSG_SHOW_WAIT, MSG_PSTS_UPDATE, MSG_MCU_REBOOT, MSG_IGMP_REINIT, }MSG_TYPE; enum{ DISPLAY_FPGA_UPGRADE_OVER=1, DISPLAY_FPGA_UPGRADE_ERR, DISPLAY_FPGA_UPGRADE_BUSY_TIMEOUT, DISPALY_RFAGC_ERR_POWER_LOW, DISPALY_RFAGC_ERR_POWER_HIGH }; typedef enum { E_RA = 0x10, W_SYSTEM, W_RF, W_WA, W_WB, W_WC, W_WD, W_WE, W_WF, W_RF_DELAY, W_ADPC, W_CONFIGA, W_CONFIGB, W_CONFIGC, W_CONFIGD, W_HTTP_CGI1, W_HTTP_CGI2, W_UPDATE_STOP, W_UPDATE, W_OUTPUT, W_FAC_C, W_FAC_F, W_FAC_H, W_RF_ONLY, W_SIM_TEST, W_SIM_PW_ERR, W_SIM_PARA, R_LOG = 100, R_RF_DELAY, R_UPDATE, //不可超过255 0xff R_SIM_PARA, R_LOG4, }PARA_TYPE; /* #define UART_RCV_BUF_LEN (1024) #define UART_SEND_BUF_LEN (256) #define UART_REC_BUF_BAK (1<<2) ////必须全bit都为1的值+1 串口接收缓冲区 #define UART_PORT_NUM (3) //(4) typedef struct { uint32 valid; uint32 task_id; //处理串口消息任务ID MUTEX_HANDLE mutex; MSG msg[UART_REC_BUF_BAK]; uint16 index; uint16 length; //发送长度 uint32 buf_cnt; uint8 buffer[UART_REC_BUF_BAK][UART_RCV_BUF_LEN]; }S_UART_RX_CTRL; */ /**********************当前文件提供的对外API函数*************************************************/ uint32 create_task(void (*fun)(void*),char* pcname,uint32 task_id,uint32 task_pro,uint32 stacksize,uint32 queuesize); uint32 task_set_ignore_chk(uint32 task_id); uint32 send_msg(uint32 task_id,pMSG pmsg); pMSG get_msg(uint32 wait_ticks); MSG* alloc_msg(void); void free_msg(pMSG p); void *alloc_mem(uint32 size); void free_mem(void* pmem); //信号量相关函数,pend函数(等待),只能在正常任务中使用,post任务体,中断均可使用 //主要用来在中断中post,然后再一个任务中pend(阻塞型),减少中断处理时间并加快任务响应速度 SEM_HANDLE create_sem(uint32 max_count,uint32 init_count); uint32 pend_sem(SEM_HANDLE sem_hd,uint32 wait_ticks); uint32 post_sem(SEM_HANDLE sem_hd); //互斥相关函数,只能在正常任务体中使用,不能用于中断 一般在多任务资源共享时使用 使用时take(若take不到,将会阻塞),用完后及时give //时间短的操作,可以关任务调度实现 MUTEX_HANDLE create_mutex(void); uint32 take_mutex(MUTEX_HANDLE mtx_hd); uint32 give_mutex(MUTEX_HANDLE mtx_hd); void os_int_enter(void); void os_int_exit(void); uint32 os_get_free_heap_size(void); S_SYS_TIME *os_get_sys_time_ptr(void); uint32 get_cpu_useage(void); void send_clk_msg(void); void calc_cpu_usage(void); //void get_sys_time(S_SYS_TIME* pt); void update_sys_time_by_rtc(void); uint32 config_time_msg(uint32 type); void sys_para_init(void); //#define get_sys_tick xTaskGetTickCount void get_msg_state(S_MSG_STATE *pstate); void get_mem_state(S_MEM_STATE *pstate); //仅在内存调试打开时有效 uint32 get_current_task_id(uint32 *pid); uint32 get_task_id(uint32 *pid,void *ptcb); void task_is_ok(void); uint32 task_chk_status(void); void os_dead_task_abnormal(uint32 task_id); void os_dead_wwdg(void); void task_stop_sec_msg(void); void task_resume_sec_msg(void); /******************************************END*****************************************************/ /* Exported functions ------------------------------------------------------- */ extern uint32 get_sys_clk(void); #if configUSE_CALC_CPU_USAGE extern uint32 get_idle_run_time(void); extern void set_idle_run_time(uint32); #endif #define OS_DEFAULT_STACK_SIZE (configMINIMAL_STACK_SIZE*2) //默认1k字节 #define OS_DEFAULT_QUEUE_SIZE (100*sizeof(void*)) /*--------------- Tasks ID -------------*/ //同一优先级任务可创建多个, typedef enum { PRIORITY_VERY_HIGH = (tskIDLE_PRIORITY+4), //最高优先级任务, PRIORITY_HIGH = (tskIDLE_PRIORITY+3), //特殊任务,如主任务等 PRIORITY_NORMAL = (tskIDLE_PRIORITY+2), //默认优先级 PRIORITY_LOW = (tskIDLE_PRIORITY+1), //低优先级任务 }E_TASK_RPIPRITY; enum E_TASK_ID { MAIN_TASK_ID = 0, LCD_TASK_ID, UART_TASK_ID, GPS_TASK_ID, WEB_TASK_ID, LOG_TASK_ID,// 5 TCP_REMOTE_TASK_ID, FPGA_UPGRADE_TASK_ID, SWAP_TASK_ID, SPECT_TASK_ID, UDP_REMOTE_TASK_ID,// 10 SNTP_TASK_ID, TEST_TASK_ID, AUTO_UDP_TASK_ID, IDLE_TASK_ID,// 14 }; //任务序号,必须全局唯一,否则会出现异常 #endif