当前位置: 首页 > news >正文

CheckSmSettings代码注释

///////////////////////////////////////////////////////////////////////////////////////// /** \param maxChannel 被检查的最后一个SM \return 0: 成功或者返回AL的状态码 \brief 这个函数检查所有的SM通道 *//////////////////////////////////////////////////////////////////////////////////////// UINT8 CheckSmSettings(UINT8 maxChannel) { UINT8 i; UINT8 result = 0; TSYNCMAN ESCMEM *pSyncMan; UINT16 SMLength = 0; UINT16 SMAddress = 0; /* 检查接收邮箱的的SM参数(SM0) */ pSyncMan = HW_GetSyncMan(MAILBOX_WRITE); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if (!(pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE)) /* 接收邮箱不能使能 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) != SM_SETTING_DIRECTION_WRITE_VALUE) /* 接收邮箱由主站不能写*/ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) != SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 接收邮箱不是在一个缓存模式 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength < MIN_MBX_SIZE ) /* 接收邮箱的大小太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength > MAX_MBX_SIZE ) /* 接收邮箱大小太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress < MIN_MBX_WRITE_ADDRESS ) /* 接收邮箱的地址太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress > MAX_MBX_WRITE_ADDRESS) /* 接收邮箱地址太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; if ( result == 0 )//则说明接收邮箱通过上面的检查 { /* 检查发送邮箱的SM参数(SM1) */ pSyncMan = HW_GetSyncMan(MAILBOX_READ); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if (!(pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE)) /* 发送邮箱不使能 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) != SM_SETTING_DIRECTION_READ_VALUE) /* 接收邮箱不能被主站读*/ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) != SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 接收邮箱不是一个缓冲区模式 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength < MIN_MBX_SIZE ) /* 发送邮箱的大小太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength > MAX_MBX_SIZE ) /* 发送邮箱的大小太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress < MIN_MBX_READ_ADDRESS ) /* 发送邮箱的地址太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress > MAX_MBX_READ_ADDRESS ) /* 发送邮箱的地址太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; } if ( result == 0 && maxChannel > PROCESS_DATA_IN )//发送邮箱通过上面的检查 { /* 当离开这个函数的时候,b3BufferMode被设置,如果输入和输出运行在3个缓冲区模式 */ b3BufferMode = TRUE; /* 检查SM的参数给输入通道(SM的通道3) */ pSyncMan = HW_GetSyncMan(PROCESS_DATA_IN); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if ( (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) != 0 && SMLength == 0 ) /* SM3的大小是等于0和SM3是激活的 */ result = SYNCMANCHSETTINGS+1; else if (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) { /* SM3是激活的,输入大小是大于0的 */ if ( SMLength != nPdInputSize || nPdInputSize == 0 || SMLength > MAX_PD_INPUT_SIZE) /* 大小不想符合sizes don't match */ result = SYNCMANCHSIZE+1; else /* 大小相互符合sizes matches */ if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) == SM_SETTING_DIRECTION_READ_VALUE ) { /* settings match */ if ( ( ( nAlStatus == STATE_PREOP )&&( SMAddress >= MIN_PD_READ_ADDRESS )&&( SMAddress <= MAX_PD_READ_ADDRESS ) ) ||( ( nAlStatus != STATE_PREOP )&&( SMAddress == nEscAddrInputData ) ) ) { /* 地址符合addresses match */ if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) == SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 如果输入输入运行在1个缓冲区的模式,重置b3BufferMode inputs are running in 1-Buffer-Mode, reset flag b3BufferMode */ b3BufferMode = FALSE; } else /* 输入地址是超越了允许的范围,或者已经在SAFEOP和OP之间改变input address is out of the allowed area or has changed in SAFEOP or OP */ result = SYNCMANCHADDRESS+1; } else /* 输入设置不相符合input settings do not match */ result = SYNCMANCHSETTINGS+1; } else if ( SMLength != 0 || nPdInputSize != 0 ) /* 输入大小不等于0,即使SM3的通道是不能使能input size is not zero although the SM3 channel is not enabled */ result = SYNCMANCHSIZE+1; if ( result != 0 )//则出错处理 { result = ALSTATUSCODE_INVALIDSMINCFG; } }//结束result==0&&maxChannel... if ( result == 0 && maxChannel > PROCESS_DATA_OUT ) { /* 检查SM参数给输入(SM2)check the Sync Manager Parameter for the Outputs (Sync Manager Channel 2) */ pSyncMan = HW_GetSyncMan(PROCESS_DATA_OUT); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if ( (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) != 0 && SMLength == 0 ) /* SM2的大小是等于0或者SM2是使能the SM2 size is 0 and the SM2 is active */ result = SYNCMANCHSETTINGS+1; else if (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) { /* 如果SM2的通道是激活的,输出的大小是比0大Sync Manager Channel 2 is active, output size has to greater 0 */ if ( SMLength == nPdOutputSize && nPdOutputSize != 0 && SMLength <= ((UINT16)MAX_PD_OUTPUT_SIZE)) { /* 大小相互符合sizes match */ if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) == SM_SETTING_DIRECTION_WRITE_VALUE ) { /* 设置符合要求settings match */ if ( ( ( nAlStatus == STATE_PREOP )&&( SMAddress >= MIN_PD_WRITE_ADDRESS )&&( SMAddress <= MAX_PD_WRITE_ADDRESS ) ) ||( ( nAlStatus != STATE_PREOP )&&( SMAddress == nEscAddrOutputData ) ) ) { /* 地址符合addresses match */ { /* 检查是否看门狗触发使能check, if watchdog trigger is enabled */ if (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_WATCHDOG_VALUE) { bWdTrigger = TRUE; } else { bWdTrigger = FALSE; } if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) == SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 输出是运行在1个缓冲区的模式,重置标志位b3BufferMode */ b3BufferMode = FALSE; } } else /* 输出地址已经超越允许的范围或者在SAFEOP和OP里面转变output address is out of the allowed area or has changed in SAFEOP or OP */ result = SYNCMANCHADDRESS+1; } else /* 输出设置不相符合output settings do not match */ result = SYNCMANCHSETTINGS+1; } else /* 输出大小不相符合output sizes don't match */ result = SYNCMANCHSIZE+1; } else if ( SMLength != 0 || nPdOutputSize != 0 ) /* 输出大小不等于0,虽然SM2通道不使能output size is not zero although the SM2 channel is not enabled */ result = SYNCMANCHSIZE+1; if ( result != 0 )//出错状态 { result = ALSTATUSCODE_INVALIDSMOUTCFG; } }//对应上面的result==0&&maxChannel... if ( result == 0 ) { UINT8 SMActivate = 0; /* 其它SM通道的使能字节被读来响应SM-改变-中断the Enable-Byte of the rest of the SM channels has to be read to acknowledge the SM-Change-Interrupt */ for (i = maxChannel; i < nMaxSyncMan; i++) { pSyncMan = HW_GetSyncMan(i); SMActivate = pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET]; } } return result; }
http://www.jsqmd.com/news/252030/

相关文章:

  • IQuest-Coder-V1-40B-Instruct部署:40B模型在消费级GPU的可行性
  • Citra模拟器完全指南:从入门到精通的使用教程
  • BGE-M3实战:智能问答检索模块
  • 123云盘功能解锁技术方案:基于用户脚本的会员特权模拟实现
  • 鸣潮自动化工具完整使用指南:从安装到精通
  • 鸣潮自动化工具深度解析:如何实现智能后台自动战斗
  • 3步搞定微信QQ消息防撤回:完整操作指南
  • Sigma:轻量快速的代码安全“侦察兵”
  • Whisper-large-v3实战:多语言转录云端部署,10分钟出结果
  • 国家中小学智慧教育平台电子课本解析工具:一键下载全套PDF教材
  • 鸣潮自动化助手:解放双手的游戏体验革命
  • Zotero插件Ethereal Style终极解决方案:从文献管理混乱到高效研究
  • 终极指南:快速掌握ab-download-manager的极速下载技巧
  • 123云盘完全解锁教程:5步获得永久会员特权
  • Zotero Style插件:让文献管理更智能高效的终极指南
  • 重庆包装设计怎么做才合理?3个关键点让产品销量翻倍
  • OpCore Simplify:3分钟解决黑苹果配置难题的智能神器
  • 微信消息防撤回工具:彻底告别信息丢失的烦恼
  • Zotero文献管理神器:5分钟掌握智能进度追踪与标签分类
  • emwin RGB接口驱动调试技巧
  • Playnite终极游戏库管理器:一站式免费整合所有游戏平台的完整解决方案
  • 腾讯混元模型体验报告:1块钱获得专业级翻译能力,真香
  • 如何三步搞定国家中小学智慧教育平台电子课本下载:tchMaterial-parser使用全攻略
  • 国家中小学智慧教育平台电子课本下载全攻略:新手也能快速上手
  • Zotero Style插件终极指南:让文献管理变得智能高效
  • 革命性智慧教育平台电子课本智能下载系统:三分钟构建个人数字图书馆
  • 鸣潮自动化工具ok-ww完整教程:从零开始解放双手
  • SAM3部署教程:手把手教你实现文本引导物体分割
  • YOLOFuse手把手教学:从零到检测只需30分钟
  • 语音识别自由:FunASR+1元GPU打破技术垄断