MAXQ3120电表参考设计的定制功能
时间:09-13
来源:互联网
点击:
添加任务
如电表参考设计中所定义,任务是一段单线程代码,它执行电表要求的某项功能,并快速(通常只有几毫秒)返回调用函数。然而,大多数任务都需要比这更长的时间才能完成。比如,在任何合理的速率下发送一个消息都需要多个周期。因此,大多数任务都需要一个状态变量,以便将其分解为数个子任务。
一旦任务编写完成,你就可以在spintaskwheel.c文件的任务列表中加入该调用。注意,你可以将任务加在执行流程的任何位置,并根据你的需要多次频繁调用它。你将发现,DSP任务调用非常频繁,串口驱动器SerialPortDriver任务也被调用了几次。因为要保持电能测量的完整性,DSP任务不允许被搁置数个周期,同时不允许SerialPortDriver任务错过输入字符。
最后,测试你的代码。任务轮循环时,你的新任务将伴随其它任务被调用。
全局变量
由于未使用真正意义上的多任务操作系统,也就意味着不会有编程人员所熟知的、真正意义上的消息传递、信号量或其它机制。通信是通过上文提到的消息板以及一组全局变量实现的,各个任务必须按照严格的规则来设置和读取这些变量信息。这些全局变量列举如下:
g_CommSystEMState: 这个变量包括一组通信通道控制位。具体来说,每个通道包括:一个active (活动)位,用于指明某个特定通道处于活动状态(从而可丢弃到达另一个通道的字符);一个TBE位,用于使闲置通道做好工作准备;以及一个data loss (数据丢失)位,当闲置通道收到字符而另一通道正忙于通信时,该位被置高。
g_TransmitByte; g_ReceiveByte: 分别保存着下一个要传送的字节和最新接收到的字节。
g_CommBuffer: 一个50字节数组,包含刚接收到的消息或要发送的消息。注意系统仅有一个通信缓存。它不仅被两个通信通道所共享,也被发送和接收通道所共享。
g_MeterAddress: 一个包含电表网络地址的6字节数组。初始化时从EEPROM内读取该信息,并存放在RAM中。
g_MessageFormatterData; g_DispFormatterData; g_ScheduleManagerData; g_AEMData; g_LCLRegData: 这些寄存器在寄存器管理器和各种任务间传送数据。例如,一个需要发送的寄存器内容,会被寄存器管理器放入g_MessageFormatterData中。
g_AEMRegisterNeeded; g_DispFormatterRegRequest; g_RequestScheduleManager; g_LCLRegRequest: 这些寄存器里,包含了特定任务需要读或写的寄存器。注意,消息译码器没有全局地址寄存器:寄存器管理器可以智能地从消息缓存中找出这个信息。
g_LCDMode: 包含显示器的模式字节。见下面的显示定制部分。
g_TariffInEffect: 包含当前有效的费率号码。这个函数有自己的全局变量,以便每次累计电能时,无需通过多次EEPROM读操作来确定将采样值存在什么位置。
g_PW: 包含当前有效的各个通信通道的口令号码。
g_irTimer; g_rsTimer: 用于计数各个通道口令有效时间的定时器。一旦接收到口令后,它的有效期限是60秒。一个口令的有效时间结束后,g_PW中相关的4位数据就会被清零。
g_LoadCurveUsage; g_LoadCurvePeak; g_LoadCurveTimeStamp: 与负载曲线记录任务相关的变量。g_LoadCurveUsage累计用电量,并会最终报告给负载曲线记录任务。负载曲线记录任务会定
期地将该值写入EEPROM并随后清除该变量。
g_LoadCurvePeak和g_LoadCurveTimeStamp跟踪负载曲线的最大功率值,并记录峰值功率产生的间隔和时间。
AEMState: 包含一组与异步事件相关的变量。当接收到一个设置电表地址消息时,msg_rx标志被置为高。地址设置逻辑电路被激活后,变量timer包含恢复正常显示所需的秒数。DSPState和Register变量跟踪寄存器用电量信息从DSP逻辑传送到用电量报告函数的过程。通常,寄存器变量包括所有用电类型(有功、无功、正功率和负功率等)。
g_new_baud: DL/T 645协议规范提供了一种只改变单个消息波特率的机制。当收到波特率变更请求并得到确认后,下一个消息就会以更高的波特率传送。随后,波特率恢复到正常值(本设计中采用1,200bps)。g_new_baud总是保存下一个消息的波特率。
g_TransmitDelay: 一些RS-485转换器在发送完最后一个字符后会延迟一段固定时间,随后切换回接收模式。因此,当主机传送完一个请求后,它可能会丢失电表发送的前几个字符,因为与主机串口相连的RS-485转换器仍处在发送模式下。这个变量保存了发送状态保持的固定延时,延时结束后主机的RS-485转换器切换回接收模式。
current_temp: 如果引用该变量,它将包含从DS3231 RTC/温度传感器中读出的最新数值。
如电表参考设计中所定义,任务是一段单线程代码,它执行电表要求的某项功能,并快速(通常只有几毫秒)返回调用函数。然而,大多数任务都需要比这更长的时间才能完成。比如,在任何合理的速率下发送一个消息都需要多个周期。因此,大多数任务都需要一个状态变量,以便将其分解为数个子任务。
一旦任务编写完成,你就可以在spintaskwheel.c文件的任务列表中加入该调用。注意,你可以将任务加在执行流程的任何位置,并根据你的需要多次频繁调用它。你将发现,DSP任务调用非常频繁,串口驱动器SerialPortDriver任务也被调用了几次。因为要保持电能测量的完整性,DSP任务不允许被搁置数个周期,同时不允许SerialPortDriver任务错过输入字符。
最后,测试你的代码。任务轮循环时,你的新任务将伴随其它任务被调用。
全局变量
由于未使用真正意义上的多任务操作系统,也就意味着不会有编程人员所熟知的、真正意义上的消息传递、信号量或其它机制。通信是通过上文提到的消息板以及一组全局变量实现的,各个任务必须按照严格的规则来设置和读取这些变量信息。这些全局变量列举如下:
g_CommSystEMState: 这个变量包括一组通信通道控制位。具体来说,每个通道包括:一个active (活动)位,用于指明某个特定通道处于活动状态(从而可丢弃到达另一个通道的字符);一个TBE位,用于使闲置通道做好工作准备;以及一个data loss (数据丢失)位,当闲置通道收到字符而另一通道正忙于通信时,该位被置高。
g_TransmitByte; g_ReceiveByte: 分别保存着下一个要传送的字节和最新接收到的字节。
g_CommBuffer: 一个50字节数组,包含刚接收到的消息或要发送的消息。注意系统仅有一个通信缓存。它不仅被两个通信通道所共享,也被发送和接收通道所共享。
g_MeterAddress: 一个包含电表网络地址的6字节数组。初始化时从EEPROM内读取该信息,并存放在RAM中。
g_MessageFormatterData; g_DispFormatterData; g_ScheduleManagerData; g_AEMData; g_LCLRegData: 这些寄存器在寄存器管理器和各种任务间传送数据。例如,一个需要发送的寄存器内容,会被寄存器管理器放入g_MessageFormatterData中。
g_AEMRegisterNeeded; g_DispFormatterRegRequest; g_RequestScheduleManager; g_LCLRegRequest: 这些寄存器里,包含了特定任务需要读或写的寄存器。注意,消息译码器没有全局地址寄存器:寄存器管理器可以智能地从消息缓存中找出这个信息。
g_LCDMode: 包含显示器的模式字节。见下面的显示定制部分。
g_TariffInEffect: 包含当前有效的费率号码。这个函数有自己的全局变量,以便每次累计电能时,无需通过多次EEPROM读操作来确定将采样值存在什么位置。
g_PW: 包含当前有效的各个通信通道的口令号码。
g_irTimer; g_rsTimer: 用于计数各个通道口令有效时间的定时器。一旦接收到口令后,它的有效期限是60秒。一个口令的有效时间结束后,g_PW中相关的4位数据就会被清零。
g_LoadCurveUsage; g_LoadCurvePeak; g_LoadCurveTimeStamp: 与负载曲线记录任务相关的变量。g_LoadCurveUsage累计用电量,并会最终报告给负载曲线记录任务。负载曲线记录任务会定
期地将该值写入EEPROM并随后清除该变量。
g_LoadCurvePeak和g_LoadCurveTimeStamp跟踪负载曲线的最大功率值,并记录峰值功率产生的间隔和时间。
AEMState: 包含一组与异步事件相关的变量。当接收到一个设置电表地址消息时,msg_rx标志被置为高。地址设置逻辑电路被激活后,变量timer包含恢复正常显示所需的秒数。DSPState和Register变量跟踪寄存器用电量信息从DSP逻辑传送到用电量报告函数的过程。通常,寄存器变量包括所有用电类型(有功、无功、正功率和负功率等)。
g_new_baud: DL/T 645协议规范提供了一种只改变单个消息波特率的机制。当收到波特率变更请求并得到确认后,下一个消息就会以更高的波特率传送。随后,波特率恢复到正常值(本设计中采用1,200bps)。g_new_baud总是保存下一个消息的波特率。
g_TransmitDelay: 一些RS-485转换器在发送完最后一个字符后会延迟一段固定时间,随后切换回接收模式。因此,当主机传送完一个请求后,它可能会丢失电表发送的前几个字符,因为与主机串口相连的RS-485转换器仍处在发送模式下。这个变量保存了发送状态保持的固定延时,延时结束后主机的RS-485转换器切换回接收模式。
current_temp: 如果引用该变量,它将包含从DS3231 RTC/温度传感器中读出的最新数值。
C语言 电子 连接器 ADC 红外 LED LCD 电压 电流 DSP 显示器 电路 传感器 Maxim 相关文章:
- 嵌入C语言的测试驱动开发:为什么要调试?(05-06)
- TD-SCDMA终端射频测试与应用业务测试(06-02)
- 自适应信号发生器方案与实现(09-22)
- 基于混合建模的 SoC软硬件协同验证平台研究(02-20)
- 基于地源热泵便携式岩土热物性测试仪研制(07-09)
- HDNS2000光学感测芯片在运动检测中的应用(06-25)