完成uC/OS-ii移植后在工程目录下建立一个app_cfg.h main.c的文件。
#include "sys.h"
#include "includes.h"
#include "stdio.h"
#include "stm32f4xx_conf.h"
#include "string.h"
#include "delay.h"
#include "uip.h"
#include "uip_arp.h"
#include "tapdev.h"
//#include "clock.h"
//#include "timer.h"
#include "uip_arp.h"
#pragma anon_unions
#ifdef APP_DE
#define APP_EXT
#else
#define APP_EXT extern
#endif
APP_EXT union
{
struct
{
u16 mark;
u8 u8Sub; //1:为辅助节点
u16 u16OutCT; //外接CT变比
//u16 u16OutPT; //外接CT变比
u8 u8Local_addr; //本节点地址
u8 u8Line_outno; //辅助节点数量
u16 V_K[3]; //电压系数
u16 I_K[4]; //电流系数
//运行参数
u16 V_R; //额定电压
u16 I_R; //额定电流
u8 u8DeviceNo;
//网络
u8 MAC_ADR[6];
u8 IP_ADR[4];
u8 IP_gatway[4];
u8 IP_mask[4];
u8 IP_HOST[4];
u16 IP_PORT;
};
u8 array[LOCAL_SIZE];
}local_info;
//设置任务堆栈大小
#define START_SIK_SIZE 512 //START
#define KEY_SIK_SIZE 128 //KEY
#define LED0_STK_SIZE 128 //LED
#define LED1_STK_SIZE 128 //LED
//#define ADC_STK_SIZE 256 //ADC
//任务堆栈声明
extern OS_STK TASK_START_STK[START_SIK_SIZE]; //起始任务
extern OS_STK TASK_KEY_STK[KEY_SIK_SIZE]; //按键检测
//extern OS_STK TASK_ADC_STK[ADC_STK_SIZE]; //ADC-TIMER
extern OS_STK TASK_LED_STK[LED0_STK_SIZE]; //LED0
extern OS_STK TASK_LED_STK[LED1_STK_SIZE]; //LED1
//任务优先级 OS_LOWEST_PRIO=63
#define OS_LOW_Prio 10
#define START_TASK_Prio (OS_LOW_Prio) //START
#define LED0_TASK_Prio (OS_LOW_Prio-1) //LED0
#define LED1_TASK_Prio (OS_LOW_Prio-2) //LED1
//#define KEY_TASK_Prio (OS_LOW_Prio-7) //KEY
//#define ADC_TASK_Prio (OS_LOW_Prio-2) //ADC
建立任务需要对任务优先级和堆栈进行定义,一般放在app_cfg.h下面。其中任务数和最小优先级数值需要和os_cfg.h文件的宏定义对应。
#pragma anon_unions : keil中默认是不支持匿名结构体的,需要编译指令#pragma anon_unions指名。
mian.c中首先创建一个起始任务,在起始任务中再去创建创建应用任务。应用任务创建完成后将起始任务挂起。
//开始任务
void start_task(void *pdata)
{
// u8 j;
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
Timer7Sem0 = OSSemCreate(0);
while(Timer7Sem0 == NULL) Timer7Sem0 = OSSemCreate(0);
KeyMbox = OSMboxCreate(NULL); /* 建立邮箱 */
while(KeyMbox == NULL) KeyMbox = OSMboxCreate(NULL);
ADMbox = OSMboxCreate(NULL); /* 建立邮箱 */
while(ADMbox == NULL) ADMbox = OSMboxCreate(NULL);
U2rxSem0 = OSSemCreate(0);
while(U2rxSem0 == NULL) U2rxSem0 = OSSemCreate(0);
U2txSem0 = OSSemCreate(0);
while(U2txSem0 == NULL) U2txSem0 = OSSemCreate(0);
//FIFOSem0 = OSMutexCreate(0,&j); /* 建立FIFO */
//while(FIFOSem0 == NULL) FIFOSem0 = OSMutexCreate(0,&j);
U1rxSem0 = OSSemCreate(0);
while(U1rxSem0 == NULL) U1rxSem0 = OSSemCreate(0);
U1txSem0 = OSSemCreate(0);
while(U1txSem0 == NULL) U1txSem0 = OSSemCreate(0);
U3rxSem0 = OSSemCreate(0);
while(U1rxSem0 == NULL) U3rxSem0 = OSSemCreate(0);
/*U1txSem0 = OSSemCreate(0);
while(U1txSem0 == NULL) U1txSem0 = OSSemCreate(0);
*/
//读flash
W25QXX_Read(local_info.array,0,LOCAL_SIZE);
while(local_info.mark != MARKC)
{
local_info.mark = MARKC;
local_info.u8Local_addr = 0x01;
local_info.u8Line_outno = 5;
local_info.u16OutCT = 1;
local_info.V_K[0] = 7166;
local_info.V_K[1] = 7125;
local_info.V_K[2] = 7100;
local_info.I_K[0] = 40094;
local_info.I_K[1] = 39790;
local_info.I_K[2] = 40380;
local_info.I_K[3] = 7847;
//运行参数
local_info.V_R =2200; //额定电压 220V
local_info.I_R = 1000; //额定电流 10A
local_info.u8DeviceNo = 12;
local_info.MAC_ADR[0] = 0xa4;
local_info.MAC_ADR[1] = 0xf2;
local_info.MAC_ADR[2] = 0x00;
local_info.MAC_ADR[3] = 0x00;
local_info.MAC_ADR[4] = 0x00;
local_info.MAC_ADR[5] = 0x03;
local_info.IP_ADR[0] = 192;
local_info.IP_ADR[1] = 168;
local_info.IP_ADR[2] = 3;
local_info.IP_ADR[3] = 172;
local_info.IP_gatway[0] = 192;
local_info.IP_gatway[1] = 168;
local_info.IP_gatway[2] = 3;
local_info.IP_gatway[3] = 1;
local_info.IP_mask[0] = 255;
local_info.IP_mask[1] = 255;
local_info.IP_mask[2] = 255;
local_info.IP_mask[3] = 0;
local_info.IP_HOST[0] = 192;
local_info.IP_HOST[1] = 168;
local_info.IP_HOST[2] = 3;
local_info.IP_HOST[3] = 171;
local_info.IP_PORT = 1400;
//报警限值
W25QXX_Erase_Sector(0);
W25QXX_Write_Page(local_info.array,0,LOCAL_SIZE);
//W25QXX_Write_Page(u8Node_parent,256,256);
W25QXX_Read(local_info.array,0,LOCAL_SIZE);
//W25QXX_Read(u8Node_parent,256,256);
}
// if(local_info.u8Line_outno >= 11) local_info.u8Line_outno = 5;
// W25QXX_Read(u8Node_parent,256,256);
RTC_GetTime(RTC_Format_BIN,&RTC_TimeStructure);
//GPIO_SetBits(GPIOB,GPIO_Pin_1);//复位PLC模块,1
OSTaskCreate(TaskCal,(void *)0,(OS_STK*)&TASKCAL_STK[TaskStkLenghLager-1],TASKCAL_PRIO);
//OSTaskCreate(TaskU1tx,(void *)0,(OS_STK*)&TASKU1TX_STK[TaskStkLengh-1],TASKU1TX_PRIO);
OSTaskCreate(TaskU3rx,(void *)0,(OS_STK*)&TASKU3RX_STK[TaskStkLengh-1],TASKU3RX_PRIO);
//OSTaskCreate(TaskU1tx,(void *)0,(OS_STK*)&TASKU1TX_STK[TaskStkLengh-1],TASKU1TX_PRIO);
//OSTaskCreate(TaskU1rx,(void *)0,(OS_STK*)&TASKU1RX_STK[TaskStkLengh-1],TASKU1RX_PRIO);
OSTaskCreate(TaskKey8led,(void *)0,(OS_STK*)&TASKKEYLED_STK[TaskStkLengh-1],TASKKEYLED_PRIO);
OSTaskCreate(TaskWDI,(void *)0,(OS_STK*)&TASKWDI_STK[TaskStkLengh-1],TASKWDI_PRIO);
OSTaskCreate(TaskCon,(void *)0,(OS_STK*)&TASKCON_STK[TaskStkLengh-1],TASKCON_PRIO);
OSTaskCreate(TaskTCP,(void *)0,(OS_STK*)&TASKTCP_STK[TaskStkLengh-1],TASKTCP_PRIO);
u8Event_top = 0;
u8Event_bottom = 0;
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
其后面就是具体需要用到的应用任务的创建了。