/*******************************************************************
*******************************************************************/
#include "..\system.h"
//#ifdef ARM_XSCALE_CPU
// #include <string.h>
//#endif
#ifdef INTEL_X86_CPU
#include <stdio.h>
#include <io.h>
#endif
#include "..\utility.h"
#include "..\dbstru.h"
#include "..\address.h"
#include "..\hardware.h"
#include "dbs.h"
/**************************** 常量定义 *************************************/
/* 配置文件版本 */
const INT16U RELEASE_VERSION = 0x8801;
const INT16U DEBUG_VERSION = 0x7703;
/***************************** 全局变量定义 ********************************/
INT8U dbsArea[DBS_LEN]; /* 运行期数据结构区 */
INT8U ROMArea[ROM_LEN]; /* 配置文件区 */
RunDEVSTRUCT * dpDevCfg[MAXGROUP]; /* DP从站配置数组 */
DEVPARM dpPrmCfg[MAXTYPE]; /* 设备参数配置数组 */
DualPortRAM *pDPRAM; /* 双口RAM结构指针 */
/***************************** 局部变量定义 ********************************/
static INT16U deviceNum = 0; /* 已配置模块总数 */
/************************** Function Prototype ******************************/
static void InitDPRamPointer(void); /* 初始化双口RAM的指针 */
static void DbsInit(void); /* Dbs模块数据初始化 */
static INT8U* ScanToIOCfg(void); /* 扫描配置文件直到IO配置结构区 */
static INT8U CfgDbsRam(INT8U* pbegin); /* 在Dbs区中分配模块空间 */
static void CfgDPRam(void); /* 在双口RAM中分配IO模块数据区 */
static INT8U CheckDevNum(void); /* 检查已配置模块个数的合法性 */
static INT8U initIOM(RunDEVSTRUCT *, DEVSTRUCT *); /* 初始化运行期模块结构 */
/**************************** 全局函数定义 *********************************/
#if defined(ARM_XSCALE_CPU) && defined(DEBUG)
#include "..\cfgarray.h"
#endif
/* 载入IO配置文件 */
INT16U dbsFileLoad(void)
{
#ifdef ARM_XSCALE_CPU
/* read config file from Compact Flash ... */
/* if no CF, we use memory to simulate CF */
#ifdef DEBUG
memcpy(CONF_ROM_ADDRESS, configarray,
(sizeof(configarray)/sizeof(configarray[0])) );
#endif
#endif
#ifdef INTEL_X86_CPU
static char fileName[FILE_PATH_LEN] = "IOConfig.dat";
FILE *pFile = NULL;
INT16U fileLen = 0;
pFile = fopen(fileName, "rb");
if (NULL == pFile)
{
return(dbError(DBS_LOAD_FILEOPENERR));
}
fileLen = (INT16U)filelength(fileno(pFile));
if (-1 == fileLen)
{
return(dbError(DBS_LOAD_FILELENERR));
}
if (fread(CONF_ROM_ADDRESS, fileLen, 1, pFile) != 1)
{
return(dbError(DBS_LOAD_WRITEROMERR));
}
if (fclose(pFile) != 0)
{
return(dbError(DBS_LOAD_FILECLOSEERR));
}
#endif
return(SYS_NOERR);
}
/* 建立运行期数据结构 */
INT16U dbsLoad(void)
{
DEVSTRUCT *pDev; /* 设备结构指针 */
RunDEVSTRUCT *pRunDev; /* 设备运行结构指针 */
INT16U i = 0; /* 配置数组索引 */
DbsInit(); /* 模块数据初始化 */
pDev = (DEVSTRUCT *)ScanToIOCfg(); /* 指向IO配置结构 */
if (NULL == pDev)
{
return(dbError(DBS_CFGFILEVER_ERR)); /* 版本错误 */
}
pRunDev = (RunDEVSTRUCT *)(DBS_ADDRESS);
deviceNum = 0;
/* 填写DP从站配置数组 */
while (pDev->Type != PEND)
{
if (((INT8U)(pDev->GroupID) <= MAXGROUP) && ((INT8U)(pDev->GroupID) > 0))
{
i = (INT16U)((pDev->GroupID) - 1);
}
else
{
return(dbError(DBS_GROUPID_ERR)); /* GroupID错误 */
}
dpDevCfg[i] = pRunDev;
initIOM(pRunDev, pDev);
deviceNum++;
pDev++;
pRunDev++;
}
if (CfgDbsRam((INT8U*)pRunDev) != 0) /* 在Dbs区中分配模块空间 */
{
return(dbError(DBS_DEVICE_TYPE_ERR));
}
CfgDPRam(); /* 在双口RAM中分配模块空间 */
if (CheckDevNum() != 0)
{
return(dbError(DBS_DEVICE_NUM_ERR));
}
return(SYS_NOERR);
} /* End of dbsLoad */
/*
功能:使用指定的值填充内存
参数: pMem 目标内存起始地址
nMem 写入区长度
value 填充值
返回值: 无
*/
void fillmem(INT8U* pMem, INT16U nMem, INT8U value)
{
INT16U i = 0;
for (i = 0; i < nMem; i++)
{
*(INT8U*)(pMem + i) = (INT8U)value;
}
}
/*
功能 : 得到指定从站的模块类型
参数 : byIOAddr 从站地址
返回值 : 成功则返回从站类型,
失败则返回0xFF, 表示从站不存在或站地址越界
*/
INT8U getIOType(INT8U byIOAddr)
{
RunDEVSTRUCT *pRunDev = NULL;
if (byIOAddr > MAXGROUP)
{
return(PEND);
}
pRunDev = dpDevCfg[byIOAddr - 1];
if (pRunDev != (RunDEVSTRUCT *)NO_DEVICE_CONFIG)
{
return(pRunDev->Type);
}
else
{
return(PEND);
}
}
/*
功能 : 得到指定从站的在线状态
参数 : byIOAddr 从站地址
返回值 : 1 表示从站在线
0 表示从站离线
0xFF表示从站不存在或站地址越界
*/
INT8U getIOStatus(INT8U byIOAddr)
{
RunDEVSTRUCT *pRunDev = NULL;
if (byIOAddr > MAXGROUP)
{
return(PEND);
}
pRunDev = dpDevCfg[byIOAddr - 1];
if (pRunDev != (RunDEVSTRUCT *)NO_DEVICE_CONFIG)
{
return(pRunDev->IOM.OnLine);
}
else
{
return(PEND);
}
}
/*
功能 : 得到指定从站输入数据区起始地址
参数 : byIOAddr 从站地址
返回值 : NULL 表示从站不存在或从站无输入数据区或站地址越界,
成功则返回从站输入数据起始地址
*/
INT8U* getIOInp(INT8U byIOAddr)
{
RunDEVSTRUCT *pRunDev = NULL;
if (byIOAddr > MAXGROUP)
{
return(NULL);
}
pRunDev = dpDevCfg[byIOAddr - 1];
if (pRunDev != (RunDEVSTRUCT *)NO_DEVICE_CONFIG)
{
return(pRunDev->pInData);
}
else
{
return(NULL);
}
}
/*
功能 : 得到指定从站输入数据区长度
参数 : byIOAddr 从站地址
返回值 : 0 表示无输入数据
0xFF表示从站不存在或站地址越界
0 ~ 255 之间表示实际数据区长度
*/
INT8U getIODataInLen(INT8U byIOAddr)
{
RunDEVSTRUCT *pRunDev = NULL;
if (byIOAddr > MAXGROUP)
{
return(PEND);
}
pRunDev = dpDevCfg[byIOAddr - 1];
if (pRunDev != (RunDEVSTRUCT *)NO_DEVICE_CONFIG)
{
return(pRunDev->RcvDataLen);
}
else
{
return(PEND);
}
}
/*
功能 : 得到指定从站输出数据区起始地址
参数 : byIOAddr 从站地址
返回值 : NULL 表示从站不存在或从站无输出数据区或站地址越界,
成功则返回从站输出数据起始地址
*/
INT8U* getIOOutp(INT8U byIOAddr)
{
RunDEVSTRUCT *pRunDev = NULL;
if (byIOAddr > MAXGROUP)
{
return(NULL);
}
pRunDev = dpDevCfg[byIOAddr - 1];
if (pRunDev != (RunDEVSTRUCT *)NO_DEVICE_CONFIG)
{
return(pRunDev->pOutData);
}
else
{
return(NULL);
}
}
/*
功能 : 得到指定从站输出数据区长度
参数 : byIOAddr 从站地址
返回值 : 0 表示无输出数据
0xFF表示从站不存在或站地址越界
0 ~ 255 之间表示实际数据区长度
*/
INT8U getIODataOutLen(INT8U byIOAddr)
{
RunDEVSTRUCT *pRunDev = NULL;
if (byIOAddr > MAXGROUP)
{
return(PEND);
}
pRunDev = dpDevCfg[byIOAddr - 1];
if (pRunDev != (RunDEVSTRUCT *)NO_DEVICE_CONFIG)
{
return(pRunDev->SndDataLen);
}
else
{
return(PEND);
}
}
/*
功能 : 得到指定从站运行结构指针
参数 : byIOAddr 从站地址
返回值 : NULL表示站地址越界
NO_DEVICE_CONFIG 表示从站不存在
成功则返回运行期结构指针
*/
RunDEVSTRUCT* getIOStructp(INT8U byIOAddr)
{
没有合适的资源?快使用搜索试试~ 我知道了~
ARM.rar_ARM编程
共28个文件
h:17个
c:10个
txt:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 2 浏览量
2022-09-21
04:36:17
上传
评论
收藏 32KB RAR 举报
温馨提示
ARM得编程实例。很经典。在win ce5.0环境下的编程实例
资源推荐
资源详情
资源评论
收起资源包目录
ARM.rar (28个子文件)
www.pudn.com.txt 218B
arm原码
tm422.h 481B
SYSCST.C 6KB
NetSrv.h 1KB
NETSRV.C 5KB
Dbs.c 14KB
NetDrv.h 1KB
dsp.h 2KB
NE2000.H 5KB
system.h 900B
utility.h 3KB
tm422.c 3KB
appmain.h 163B
SYSCST.H 1KB
crc.h 2KB
hardware.h 3KB
armmain.c 255B
DSP.C 12KB
Dbstru.h 5KB
Address.h 558B
Dbs.h 2KB
timer.c 1KB
cfgarray.h 2KB
general.h 352B
timer.h 419B
appmain.c 13KB
NETDRV.C 13KB
hardware.c 6KB
共 28 条
- 1
资源评论
钱亚锋
- 粉丝: 101
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功