NiosII控制板软件模块规划.docx
- 文档编号:4057259
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:20
- 大小:19.51KB
NiosII控制板软件模块规划.docx
《NiosII控制板软件模块规划.docx》由会员分享,可在线阅读,更多相关《NiosII控制板软件模块规划.docx(20页珍藏版)》请在冰豆网上搜索。
NiosII控制板软件模块规划
NiosII软件模块规划
一.概述。
由于本软件采用uCLinux嵌入式操作系统,所以各功能模块采用独立的线程实现其模块功能。
线程间通信采用邮箱或全局结构变量,线程同步、临界资源保护采用信号量。
整个软件主要包括以下模块:
1,主启动模块;
2,本地模块
3,远程通讯模块
4,告警模块
5,输入输出模块
6,存储处理模块
二.各模块的主要功能实现和全局结构变量介绍
1.主启动模块:
程序入口点,负责初始化所有数据,启动其他各线程模块,并不断做数据合法性检查,若有异常,则复位CPU,其实现大体如下:
voidAppStartTask(void*p_arg)
{
(void)p_arg;
LED_ON_OFF(FALSE,COM_LED);
LED_ON_OFF(TRUE,COM_LED);
#ifOS_TASK_STAT_EN>0
OSStatInit();/*DetermineCPUcapacity*/
#endif
LED_ON_OFF(FALSE,COM_LED);
LED_ON_OFF(TRUE,COM_LED);
GetLastReset();
LED_ON_OFF(FALSE,COM_LED);
LED_ON_OFF(TRUE,COM_LED);
WatchDogInit();
LED_ON_OFF(FALSE,COM_LED);
LED_ON_OFF(TRUE,COM_LED);
InitAllData();//====byszd2006-03-09
Init_Tasks();//====byszd2005-10-10
OSTimeDlyHMSM(0,0,0,1);
mWDT.en_dog_Start=TRUE;
while(TRUE)
{
mWDT.dog_Start=CLEAR_DOG;
OSTimeDlyHMSM(0,0,0,500);
mWDT.dog_Start=CLEAR_DOG;
////ForLCD_TaskFunction
#if(STORE_ENABLE>0)
Get2Str4RT(RealTime.GetTime);
#endif
mWDT.dog_Start=CLEAR_DOG;
CheckSram();
}
}
2.本地模块
本地通信模块负责把串口接收的协议按直连协议解包,设置入相应的数据结构,或是从数据结构中读出。
本模块涉及的数据结构有两个。
(1)可设置且可查询的变量在如下数据结构里:
typedefstructset_Para
{
//////////////////
//////////////////
INT8URF_Switch;
INT8URF_Switch_Up;
INT8URF_Switch_Forced;
INT8UPA_Switch[8];
//////////////////
INT16UCh_No_InUse[16];
INT16UCh_Shift_InUse[16];
INT8UAttValueUp;
INT8UAttValueDn;
INT8UAttValueXUp;
INT8UAttValueXDn;
INT8UVwsrRatioLimitDn;
INT8SPwrAmpOverTempLmt;
INT8SPwrInLowLmtDn;
INT8SPwrInOverLmtDn;
INT8SPwrOutLowLmtDn;
INT8SPwrOutOverLmtDn;
//////////////////
INT8SPwrOutOverLmtUp;
///////////////2006.12.15
INT8UStrSaveTblBuff[200];
INT8UAlarmUpType;
INT16UResetCnt;
}SET_PARA,*PTSET_PARA;
(2)可查询但不可设置的变量在如下数据结构里:
typedefstructRTD_para
{
//////////////////
//////////////////
INT8SPwrTempValue;
FP32PwrTempVoltage;
INT8SPwrOutValueDn;
FP32PwrOutVoltageDn;
INT8SPwrOutValueUp;
FP32PwrOutVoltageUp;
/////////////
INT8SPwrInValueDn;
////////////
//////////////
INT8SRvsPwrOutValueDn;
INT8SPwrGainInTheoryUp;
INT8SPwrGainInFactDn;
INT8SVwsrRatioDn;
//////////////
INT8UStrQVoltageBuff[5];
}RTD_PARA,*PTRTD_PARA;
(3)功能实现如下:
voidAppUart0Task(void*pdata)
{
#ifEN_TEST_UART0_PACK>0
AT91PS_USARTUSART_pt=AT91C_BASE_US0;
INT8U*ptBuffer;
#endif
//xdataUCHARrslt;
//xdataUINTmbx_data;
//////////////////////
//////////////////////
xdataUCHARchk_rslt;
//INT8U*RxMsg;
INT8Uerr;
(void)pdata;
//init_modem();
OSTimeDlyHMSM(0,0,0,20);
for(;;)
{
#ifOS_SEM_EN>0
OSSemPend(Uart0_Sem,0,&err);
#endif
{
//m_ookk=0;
mWDT.dog_ch_a=CLEAR_DOG;
OSSemPend(Using_Uart0_Sem,0,&err);
mWDT.dog_ch_a=CLEAR_DOG;
//RxMsg=(INT8U*)OSMboxPend(RxMbox,0,&err);
#ifPROTOCOL_CMCC>0
mWDT.dog_ch_a=CLEAR_DOG;
chk_rslt=de_pack_data(&pack_a_rcv);
mWDT.dog_ch_a=CLEAR_DOG;
if(chk_rslt==0x00)
{
mWDT.dog_ch_a=CLEAR_DOG;
Deal_Pack(&pack_a_rcv,&pack_a_snd);
}
elseif(chk_rslt==ACK_CRC)
{
mWDT.dog_ch_a=CLEAR_DOG;
ack_back(&pack_a_rcv,&pack_a_snd,ACK_CRC);
}
#endif
//////////////////////
#ifPROTOCOL_UNICM>0
chk_rslt=de_pack_data(&pack_a_rcv,TRUE);
if(chk_rslt==OTHER_ERROR)
{
ack_back(&pack_a_rcv,&pack_a_snd,OTHER_ERROR);
pack_a_rcv.package_dealt=TRUE;
pt_a_rcv=pack_a_rcv.packed_data;
OSSemPost(Using_Uart0_Sem);
continue;
}
if(chk_rslt==0x00)
{
chk_rslt=check_addr_dvc(&pack_a_rcv);
if((chk_rslt==NORMAL)&&(pack_a_rcv.depack_data[4]==TYPE_LN_AMP))
{
if(pack_a_rcv.depack_data[5]==CMMND_CNTR_Q)
{
ack_CNTR_Q(&pack_a_rcv,&pack_a_snd);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_PARA_Q)
{
ack_PARA_Q(&pack_a_rcv,&pack_a_snd);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SLV_Q)
{
ack_SLV_Q(&pack_a_rcv,&pack_a_snd);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_NUM)
{
if((pack_a_rcv.depack_data[17]!
=0x00)&&(pack_a_rcv.depack_data[17]!
=0xFF))
{
ack_back(&pack_a_rcv,&pack_a_snd,OTHER_ERROR);
}
else
{
deal_SET_NUM(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_COMM)
{
deal_SET_COMM(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_LOCAL)
{
deal_SET_LOCAL(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_ENALARM)
{
deal_SET_ENALARM(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_LIMIT)
{
deal_SET_LIMIT(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_ENPWR)
{
deal_SET_ENPWR(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_ATT)
{
deal_SET_ATT(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_PLL)
{
deal_SET_PLL(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_SET_SLV)
{
deal_SET_SLV(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_CAL_GAIN)
{
deal_CAL_GAIN(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_TABLE_Q)
{
rslt=deal_TABLE_Q(&pack_a_rcv,&pack_a_snd);
if(rslt==FALSE)
{
ack_back(&pack_a_rcv,&pack_a_snd,OTHER_ERROR);
}
}
elseif(pack_a_rcv.depack_data[5]==CMMND_TABLE_S)
{
rslt=deal_TABLE_S(&pack_a_rcv);
if(rslt==FALSE)
{
ack_back(&pack_a_rcv,&pack_a_snd,OTHER_ERROR);
}
else
{
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
}
elseif(pack_a_rcv.depack_data[5]==CMMND_OTHER_S)
{
deal_OTHER_S(&pack_a_rcv);
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_ALARM)
{
if(pack_a_rcv.depack_data[11]==0x00)
{
/*
////BySZD2006.03.14
os_check_task(ALARM_FUNC,&task_tab);
if(task_tab.state==K_BLOCKED)
{
os_send_signal(ALARM_FUNC);
}
*/
}
}
elseif(pack_a_rcv.depack_data[5]==CMMND_ENCRYPT_Q)
{
ack_ENCRYPT_Q(&pack_a_rcv,&pack_a_snd);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_ENCRYPT_S)
{
rslt=deal_SET_ENCRYPT(&pack_a_rcv);
if(rslt==TRUE)
{
ack_back(&pack_a_rcv,&pack_a_snd,NORMAL);
}
}
elseif(pack_a_rcv.depack_data[5]==CMMND_VOLT_Q)
{
deal_VOLT_Q(&pack_a_rcv,&pack_a_snd);
}
}
elseif(pack_a_rcv.depack_data[4]==TYPE_LN_AMP)
{
if(pack_a_rcv.depack_data[5]==CMMND_VOLT_Q)
{
deal_VOLT_Q(&pack_a_rcv,&pack_a_snd);
}
elseif(pack_a_rcv.depack_data[5]==CMMND_ALARM)
{
if(pack_a_rcv.depack_data[11]==0x00)
{
/*
////BySZD2006.03.14
os_check_task(ALARM_SLAVE,&task_tab);
if(task_tab.state==K_BLOCKED)
{
os_send_signal(ALARM_FUNC);
}
*/
}
}
else
{
/*
////BySZD2006.03.14
os_delete_task(ALARM_SLAVE);
os_send_token(USING_S_PORT);
*/
}
}
elseif(chk_rslt==TYPE_ERROR)
{
ack_back(&pack_a_rcv,&pack_a_snd,TYPE_ERROR);
}
elseif((chk_rslt==ADDR_ERROR)&&(pack_a_rcv.depack_data[4]==TYPE_LN_AMP))
{
if(pack_a_rcv.depack_data[5]==CMMND_VOLT_Q)
{
deal_VOLT_Q(&pack_a_rcv,&pack_a_snd);
}
else
{
ack_back(&pack_a_rcv,&pack_a_snd,ADDR_ERROR);
}
}
elseif((chk_rslt==DVC_ERROR)&&(pack_a_rcv.depack_data[4]==TYPE_LN_AMP))
{
if(pack_a_rcv.depack_data[5]==CMMND_VOLT_Q)
{
deal_VOLT_Q(&pack_a_rcv,&pack_a_snd);
}
else
{
ack_back(&pack_a_rcv,&pack_a_snd,DVC_ERROR);
}
}
}
elseif(chk_rslt==CRC_ERROR)
{
ack_back(&pack_a_rcv,&pack_a_snd,CRC_ERROR);
}
else
{
ack_back(&pack_a_rcv,&pack_a_snd,OTHER_ERROR);
}
//pack_a_rcv.package_dealt=TRUE;
//pt_a_rcv=pack_a_rcv.packed_data;
#endif
}
pack_a_rcv.package_dealt=TRUE;
pt_a_rcv=pack_a_rcv.packed_data;
OSSemPost(Using_Uart0_Sem);
//AT91F_US_PutChar(USART_pt,charSend);
mWDT.en_dog_ch_a=FALSE;
OSTimeDlyHMSM(0,0,0,1);
}
}
3.远程通讯模块
远程通讯模块负责把从Modem接收的协议包按远程协议解包,设置入相应的数据结构,或是从数据结构中读出。
本模块涉及的数据结构除了和直连相同的两个外,还有一个专用于Modem数据结构,用来记录Modem的电话号码、通信情况,发现Modem死机好立即给它断电重启。
其数据结构如下:
typedefstructmodem
{
INT8USVRcenter_No[20];
INT8UFRMcenter_No[5][20];
INT8UToCenter_No[20];
INT8ULocal_No[20];
INT8UStr_SMS_No[20];
INT8UIP_Address[4];
INT16UIP_Port;
INT8Ucomm_mode;
INT8USubmit_Type;
//REAL_TIMERealTime;
//INT32Uaddress;
//INT8Udevice;
INT8Umdm_init_ok;
INT16UAlarmPackID;
INT8Uold_alarm;
INT8Uprtcl_ver;
INT8UMdmSndErr;
INT8UMdmSndErrOld;
}CDMA_MODEM,*PTCDMA_MODEM;
程序功能实现则如下:
voidAppUart1Task(void*pdata)
{
#if(BS_INFO_ENABLE>0)
INT8UBsInfoCnt;
BOOLEANRdSwitch=FALSE;
#endif
(void)pdata;
//i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NiosII 控制板 软件 模块 规划