lpcmanager

Parents 60e25a5831c8
Children 97f73764f557
Modbus scan rate accuracy improved: timer is incremented according to current-old time delta. Current time is acquired with rt_timer_read().
--- a/LPCBus/MC9.c Mon Apr 18 13:17:09 2016 +0200
+++ b/LPCBus/MC9.c Thu May 05 13:36:49 2016 +0200
@@ -44,9 +44,10 @@
typedef struct
{
- unsigned char status; /* Current status of timer - running / expired */
- uint64_t actValue; /* Actual timer value */
- uint64_t toValue; /* Timeout value - initialized at startup */
+ unsigned char status; /* Current status of timer - running / expired */
+ uint64_t actValue; /* Actual timer value */
+ uint64_t toValue; /* Timeout value - initialized at startup */
+ uint64_t oldTime; /* Time at previous timer increment; NOTE: if RTIME (unsigned long long) changes type, oldTime has to be adapted */
} commTimer;
#define TIM_DISABLED 0
--- a/LPCBus/MC9_OnBoard_decl.c Mon Apr 18 13:17:09 2016 +0200
+++ b/LPCBus/MC9_OnBoard_decl.c Thu May 05 13:36:49 2016 +0200
@@ -291,11 +291,13 @@
return 0;
}
+#define nsTOus(ns) (ns/1000L)
#define nsTOms(ns) (ns/1000000L)
#define INVALID_RTU_ADDR 255 /* Used when no Modbus RTU slave device is present */
static void mbmrtu_BusUpdate_proc(void *param){
- uint64_t msticktime = nsTOms(common_ticktime__);
- while (rt_task_sleep_until(TM_INFINITE) == -EINTR){
+ uint64_t actTime;
+
+ while (rt_task_sleep_until(TM_INFINITE) == -EINTR){
int i;
for(i=0;i<MAX_MOD_RTU_DEVICES;i++)
{
@@ -303,11 +305,12 @@
{
if(mbRtuDevTim[i].status != TIM_DISABLED)
{
- mbRtuDevTim[i].actValue += msticktime;
+ actTime = (uint64_t)nsTOus(rt_timer_read());
+ mbRtuDevTim[i].actValue += actTime - mbRtuDevTim[i].oldTime;
+ mbRtuDevTim[i].oldTime = actTime;
+
if(mbRtuDevTim[i].actValue < mbRtuDevTim[i].toValue)
- {
mbRtuDevTim[i].status = TIM_EN_RUNNING;
- }
else
mbRtuDevTim[i].status = TIM_EN_EXPIRED;
}