From eca6fc6efc68fd168cb47cfd6a91d7c6af5c53f5 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 10 Apr 2023 23:33:24 +0200 Subject: [PATCH] avr: try calculating idle times. --- aqhome/msg/0BUILD | 2 + aqhome/msg/endpoint_log.c | 2 + aqhome/msg/msg_memstats.c | 19 ++++++--- aqhome/msg/msg_memstats.h | 1 + aqhome/msg/msg_node.c | 1 + aqhome/msg/msg_node.h | 1 + aqhome/msg/msg_sysstats.c | 85 +++++++++++++++++++++++++++++++++++++++ aqhome/msg/msg_sysstats.h | 35 ++++++++++++++++ avr/att84_temp1.asm | 8 ++++ avr/com.asm | 7 ++++ avr/comproto.asm | 1 + avr/comproto_memstats.asm | 8 +++- avr/comproto_sysstats.asm | 72 +++++++++++++++++++++++++++++++++ avr/main.asm | 3 ++ avr/timer.asm | 77 ++++++++++++++++++++++++++++++++++- 15 files changed, 315 insertions(+), 7 deletions(-) create mode 100644 aqhome/msg/msg_sysstats.c create mode 100644 aqhome/msg/msg_sysstats.h create mode 100644 avr/comproto_sysstats.asm diff --git a/aqhome/msg/0BUILD b/aqhome/msg/0BUILD index d2f68c0..7e11fd0 100644 --- a/aqhome/msg/0BUILD +++ b/aqhome/msg/0BUILD @@ -59,6 +59,7 @@ msg_sendstats.h msg_recvstats.h msg_memstats.h + msg_sysstats.h msg_value.h msg_value2.h msg_device.h @@ -91,6 +92,7 @@ msg_sendstats.c msg_recvstats.c msg_memstats.c + msg_sysstats.c msg_value.c msg_value2.c msg_device.c diff --git a/aqhome/msg/endpoint_log.c b/aqhome/msg/endpoint_log.c index 51281f7..d34d9ac 100644 --- a/aqhome/msg/endpoint_log.c +++ b/aqhome/msg/endpoint_log.c @@ -19,6 +19,7 @@ #include "aqhome/msg/msg_sendstats.h" #include "aqhome/msg/msg_recvstats.h" #include "aqhome/msg/msg_memstats.h" +#include "aqhome/msg/msg_sysstats.h" #include "aqhome/msg/msg_ping.h" #include "aqhome/msg/msg_pong.h" #include "aqhome/msg/msg_needaddr.h" @@ -136,6 +137,7 @@ void _logMessage(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) case AQH_MSG_TYPE_DENY_ADDRESS: AQH_DenyAddrMsg_DumpToBuffer(msg, dbuf, "received"); break; case AQH_MSG_TYPE_DEVICE: AQH_DeviceMsg_DumpToBuffer(msg, dbuf, "received"); break; case AQH_MSG_TYPE_MEMSTATS: AQH_MemStatsMsg_DumpToBuffer(msg, dbuf, "received"); break; + case AQH_MSG_TYPE_SYSSTATS: AQH_SysStatsMsg_DumpToBuffer(msg, dbuf, "received"); break; default: AQH_NodeMsg_DumpToBuffer(msg, dbuf, "received"); break; } } diff --git a/aqhome/msg/msg_memstats.c b/aqhome/msg/msg_memstats.c index 0dc28c4..e8e9e2e 100644 --- a/aqhome/msg/msg_memstats.c +++ b/aqhome/msg/msg_memstats.c @@ -26,8 +26,9 @@ #define AQH_MSG_OFFS_MEMSTATS_MAXBUFFERSUSED 11 /* 1 byte */ #define AQH_MSG_OFFS_MEMSTATS_SENDNOBUFFER 12 /* 2 bytes */ #define AQH_MSG_OFFS_MEMSTATS_RECVNOBUFFER 14 /* 2 bytes */ +#define AQH_MSG_OFFS_MEMSTATS_IDLEPERCENT 16 /* 1 byte */ -#define AQH_MSG_MEMSTATS_MINSIZE (AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_RECVNOBUFFER+2) +#define AQH_MSG_MEMSTATS_MINSIZE (AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_IDLEPERCENT+1) @@ -53,14 +54,14 @@ uint16_t AQH_MemStatsMsg_GetStackPtr(const GWEN_MSG *msg) uint8_t AQH_MemStatsMsg_GetBuffersUsed(const GWEN_MSG *msg) { - return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_BUFFERSUSED, 0); + return AQH_NodeMsg_GetUint8At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_BUFFERSUSED, 0); } uint8_t AQH_MemStatsMsg_GetMaxBuffersUsed(const GWEN_MSG *msg) { - return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_MAXBUFFERSUSED, 0); + return AQH_NodeMsg_GetUint8At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_MAXBUFFERSUSED, 0); } @@ -79,15 +80,23 @@ uint16_t AQH_MemStatsMsg_GetRecvNoBufferErrors(const GWEN_MSG *msg) +uint8_t AQH_MemStatsMsg_GetIdlePercentage(const GWEN_MSG *msg) +{ + return AQH_NodeMsg_GetUint8At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_MEMSTATS_IDLEPERCENT, 0); +} + + + void AQH_MemStatsMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText) { GWEN_Buffer_AppendArgs(dbuf, - "0x%02x->0x%02x: MEMSTATS %s (uid=0x%08x, uptime=%d, stackptr=%d[%04x], buffers used=%d(max=%d), no sendbuf errs=%d, no recvbuf=%d)\n", + "0x%02x->0x%02x: MEMSTATS %s (uid=0x%08x, uptime=%d, idle=%d, stackptr=%d[%04x], buffers used=%d(max=%d), no sendbuf errs=%d, no recvbuf=%d)\n", AQH_NodeMsg_GetSourceAddress(msg), AQH_NodeMsg_GetDestAddress(msg), sText, (unsigned int) AQH_MemStatsMsg_GetUid(msg), - AQH_MemStatsMsg_GetSeconds(msg), + AQH_MemStatsMsg_GetSeconds(msg), + AQH_MemStatsMsg_GetIdlePercentage(msg), AQH_MemStatsMsg_GetStackPtr(msg), AQH_MemStatsMsg_GetStackPtr(msg), AQH_MemStatsMsg_GetBuffersUsed(msg), diff --git a/aqhome/msg/msg_memstats.h b/aqhome/msg/msg_memstats.h index ffee198..e133bc2 100644 --- a/aqhome/msg/msg_memstats.h +++ b/aqhome/msg/msg_memstats.h @@ -25,6 +25,7 @@ AQHOME_API uint8_t AQH_MemStatsMsg_GetBuffersUsed(const GWEN_MSG *msg); AQHOME_API uint8_t AQH_MemStatsMsg_GetMaxBuffersUsed(const GWEN_MSG *msg); AQHOME_API uint16_t AQH_MemStatsMsg_GetSendNoBufferErrors(const GWEN_MSG *msg); AQHOME_API uint16_t AQH_MemStatsMsg_GetRecvNoBufferErrors(const GWEN_MSG *msg); +AQHOME_API uint8_t AQH_MemStatsMsg_GetIdlePercentage(const GWEN_MSG *msg); AQHOME_API void AQH_MemStatsMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText); diff --git a/aqhome/msg/msg_node.c b/aqhome/msg/msg_node.c index 8e8c1c7..5673c70 100644 --- a/aqhome/msg/msg_node.c +++ b/aqhome/msg/msg_node.c @@ -205,6 +205,7 @@ uint32_t AQH_NodeMsg_GetMsgGroup(uint8_t msgType) case AQH_MSG_TYPE_DEBUG: case AQH_MSG_TYPE_DEVICE: case AQH_MSG_TYPE_MEMSTATS: + case AQH_MSG_TYPE_SYSSTATS: return AQH_MSG_TYPEGROUP_INFO; case AQH_MSG_TYPE_VALUE: case AQH_MSG_TYPE_VALUE2: diff --git a/aqhome/msg/msg_node.h b/aqhome/msg/msg_node.h index 6645e6f..ce57bad 100644 --- a/aqhome/msg/msg_node.h +++ b/aqhome/msg/msg_node.h @@ -43,6 +43,7 @@ #define AQH_MSG_TYPE_DEVICE 80 #define AQH_MSG_TYPE_MEMSTATS 81 +#define AQH_MSG_TYPE_SYSSTATS 82 /* internal msg types via NET interface */ diff --git a/aqhome/msg/msg_sysstats.c b/aqhome/msg/msg_sysstats.c new file mode 100644 index 0000000..273049f --- /dev/null +++ b/aqhome/msg/msg_sysstats.c @@ -0,0 +1,85 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2023 Martin Preuss, all rights reserved. + * + * The license for this file can be found in the file COPYING which you + * should have received along with this file. + ****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "aqhome/msg/msg_sysstats.h" + +#include +#include +#include +#include + + + +#define AQH_MSG_OFFS_SYSSTATS_SECONDS 0 /* 4 bytes */ +#define AQH_MSG_OFFS_SYSSTATS_UID 4 /* 4 bytes */ +#define AQH_MSG_OFFS_SYSSTATS_COMIRQS 8 /* 2 bytes */ +#define AQH_MSG_OFFS_SYSSTATS_TIMERIRQS 10 /* 2 bytes */ +#define AQH_MSG_OFFS_SYSSTATS_IDLEPERCENT 12 /* 1 byte */ + +#define AQH_MSG_MEMSTATS_MINSIZE (AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_SYSSTATS_IDLEPERCENT+1) + + + +uint32_t AQH_SysStatsMsg_GetUid(const GWEN_MSG *msg) +{ + return AQH_NodeMsg_GetUint32At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_SYSSTATS_UID, 0); +} + + + +uint32_t AQH_SysStatsMsg_GetSeconds(const GWEN_MSG *msg) +{ + return AQH_NodeMsg_GetUint32At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_SYSSTATS_SECONDS, 0); +} + + +uint16_t AQH_SysStatsMsg_GetComInterrupts(const GWEN_MSG *msg) +{ + return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_SYSSTATS_COMIRQS, 0); +} + + + +uint16_t AQH_SysStatsMsg_GetTimerInterrupts(const GWEN_MSG *msg) +{ + return AQH_NodeMsg_GetUint16At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_SYSSTATS_TIMERIRQS, 0); +} + + + +uint8_t AQH_SysStatsMsg_GetIdlePercentage(const GWEN_MSG *msg) +{ + return AQH_NodeMsg_GetUint8At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_SYSSTATS_IDLEPERCENT, 0); +} + + + +void AQH_SysStatsMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText) +{ + GWEN_Buffer_AppendArgs(dbuf, + "0x%02x->0x%02x: SYSSTATS %s (uid=0x%08x, uptime=%d, idle=%d, com irqs=%d, timer irqs=%d)\n", + AQH_NodeMsg_GetSourceAddress(msg), + AQH_NodeMsg_GetDestAddress(msg), + sText, + (unsigned int) AQH_SysStatsMsg_GetUid(msg), + AQH_SysStatsMsg_GetSeconds(msg), + AQH_SysStatsMsg_GetIdlePercentage(msg), + AQH_SysStatsMsg_GetComInterrupts(msg), + AQH_SysStatsMsg_GetTimerInterrupts(msg)); +} + + + + + + + diff --git a/aqhome/msg/msg_sysstats.h b/aqhome/msg/msg_sysstats.h new file mode 100644 index 0000000..aa2f3a3 --- /dev/null +++ b/aqhome/msg/msg_sysstats.h @@ -0,0 +1,35 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2023 Martin Preuss, all rights reserved. + * + * The license for this file can be found in the file COPYING which you + * should have received along with this file. + ****************************************************************************/ + +#ifndef AQH_SYS_MEMSTATS_H +#define AQH_SYS_MEMSTATS_H + + +#include +#include + +#include +#include + + + +AQHOME_API uint32_t AQH_SysStatsMsg_GetUid(const GWEN_MSG *msg); +AQHOME_API uint32_t AQH_SysStatsMsg_GetSeconds(const GWEN_MSG *msg); +AQHOME_API uint16_t AQH_SysStatsMsg_GetComInterrupts(const GWEN_MSG *msg); +AQHOME_API uint16_t AQH_SysStatsMsg_GetTimerInterrupts(const GWEN_MSG *msg); +AQHOME_API uint8_t AQH_SysStatsMsg_GetIdlePercentage(const GWEN_MSG *msg); + + +AQHOME_API void AQH_SysStatsMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText); + + + +#endif + + + diff --git a/avr/att84_temp1.asm b/avr/att84_temp1.asm index 01bb641..27c7e50 100644 --- a/avr/att84_temp1.asm +++ b/avr/att84_temp1.asm @@ -228,6 +228,7 @@ .include "comproto_stats.asm" .include "comproto_device.asm" .include "comproto_memstats.asm" +.include "comproto_sysstats.asm" .include "comproto_values.asm" ;.include "comproto_debug.asm" ;.include "comproto_twi.asm" @@ -246,6 +247,7 @@ sramTimerProtocolEverySec: .byte 2 sramTimerEnqueueComStats: .byte 2 sramTimerEnqueueMemStats: .byte 2 +sramTimerEnqueueSysStats: .byte 2 sramTimerEnqueueValues: .byte 2 sramTimerSI7021Measure: .byte 2 @@ -272,6 +274,7 @@ timerList: .dw sramTimerProtocolEverySec, CPRO_OnEverySecond, 0, 1 ; every 1s .dw sramTimerEnqueueComStats, enqueueComStats, TIMER_FLAGS_IF_ADDR, 300 ; every 5m .dw sramTimerEnqueueMemStats, enqueueMemStats, TIMER_FLAGS_IF_ADDR, 300 ; every 5m + .dw sramTimerEnqueueSysStats, enqueueSysStats, TIMER_FLAGS_IF_ADDR, 60 ; every 60s .dw sramTimerSI7021Measure, SI7021_PeriodicMeasurement, 0, 30 ; every 30s .dw sramTimerEnqueueValues, Main_SendValueMsg, TIMER_FLAGS_IF_ADDR, 60 ; every 1m .dw 0 ; end of list @@ -311,6 +314,11 @@ enqueueMemStats: rjmp CPRO_EnqueueDevice +enqueueSysStats: + ldi r16, 0xff ; send to everybody + rjmp CPRO_EnqueueSysStats + + diff --git a/avr/com.asm b/avr/com.asm index 9c44c84..d5452bc 100644 --- a/avr/com.asm +++ b/avr/com.asm @@ -66,6 +66,8 @@ comDataBegin: comRepeatCount: .byte 1 comReserved1: .byte 1 + comInterrupts: .byte 2 + comStatsPacketsIn: .byte 2 comStatsPacketsOut: .byte 2 @@ -116,6 +118,11 @@ comIsrPcint0: push xl push yh push yl + lds xl, comInterrupts + lds xh, comInterrupts+1 + adiw xh:xl, 1 + sts comInterrupts, xl + sts comInterrupts+1, xh rcall comReceivePacketHandleBuffer ; (R1, R16, R17, R18, R19, R20, R21, R22, X, Y pop yl pop yh diff --git a/avr/comproto.asm b/avr/comproto.asm index fa73d10..7dd0c68 100644 --- a/avr/comproto.asm +++ b/avr/comproto.asm @@ -37,6 +37,7 @@ .equ CPRO_CMD_DEVICE = 80 .equ CPRO_CMD_MEMSTATS = 81 +.equ CPRO_CMD_SYSSTATS = 82 ; flags for variable payload enqueue function diff --git a/avr/comproto_memstats.asm b/avr/comproto_memstats.asm index fd42781..a6afe61 100644 --- a/avr/comproto_memstats.asm +++ b/avr/comproto_memstats.asm @@ -34,7 +34,7 @@ CPRO_EnqueueMemStats: push xh push xl mov r16, r6 - ldi r17, CPRO_PAYLOAD_FLAGS_UID | CPRO_PAYLOAD_FLAGS_SECONDS | (8<