配置main_cfg.h main.c文件

完成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(); //退出临界区(可以被中断打断)


其后面就是具体需要用到的应用任务的创建了。



猜你喜欢

转载自blog.csdn.net/li_qcxy/article/details/54975926