news 2026/4/16 8:39:33

CheckSmSettings代码注释

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 23:33:35

BGE-M3实战:智能问答检索模块

BGE-M3实战&#xff1a;智能问答检索模块 1. 引言 在当前信息爆炸的时代&#xff0c;构建高效、精准的智能问答系统已成为企业知识管理、客服自动化和搜索引擎优化的核心需求。传统的关键词匹配方法已难以满足复杂语义理解的需求&#xff0c;而基于深度学习的文本嵌入模型正逐…

作者头像 李华
网站建设 2026/4/15 0:39:46

Zotero Style插件:让文献管理变得高效又美观的终极指南

Zotero Style插件&#xff1a;让文献管理变得高效又美观的终极指南 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件&#xff0c;提供了一系列功能来增强 Zotero 的用户体验&#xff0c;如阅读进度可视化和标签管理&#xff0c;适合研究人员和学者。 项目地址…

作者头像 李华
网站建设 2026/4/15 20:13:04

三步掌握电子课本下载神器:轻松获取教育资源全攻略

三步掌握电子课本下载神器&#xff1a;轻松获取教育资源全攻略 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为无法离线使用国家中小学智慧教育平台的电子课…

作者头像 李华
网站建设 2026/3/25 15:34:06

Zotero-Style:终极文献管理美化插件完整指南

Zotero-Style&#xff1a;终极文献管理美化插件完整指南 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件&#xff0c;提供了一系列功能来增强 Zotero 的用户体验&#xff0c;如阅读进度可视化和标签管理&#xff0c;适合研究人员和学者。 项目地址: https://…

作者头像 李华
网站建设 2026/4/5 22:02:36

高并发场景下的消息幂等性全攻略:10万+ TPS 精确一次消费实践指南

在分布式系统中,“消息只被消费一次” 是一个经典又棘手的问题。 在高并发(峰值 TPS 10万+)场景下,网络抖动、重试机制、重复投递、消费者故障等,都可能导致消息被多次处理。 如果幂等性设计不当,轻则重复扣库存,重则导致资金错误、业务数据混乱。 本文将带你从 消息队…

作者头像 李华