Debug: utläsning av sekvenser *uppdaterat*
Postat: 13 mars 2014, 11:30:27
Ibland har man ett nästan fungerande system och man vill se vad som händer vissa saker, vilka sekvenser osv.
Jag ser oftast till att få en fungerande seriell port på ett system, det är mycket bra för att skriva ut meddelanden och värden i debugsyfte. Men jag försöker oftast att använda interruptstyrd utskrift varför en debug-utskrift inifrån en ISR kan låsa allt. Inte bra!
Alltså behövs en möjlighet att samla ihop sekvenserna i någon buffer och sedan skriva ut som vid lämpligt tillfälle. Och det har jag sedan gjort vid att deklarera:
I main-loop lägger jag då:
och de ställen jag vill lägga in en "har varit här"-markering:
#if USE_SEQUENCE
Sequence_Add(18); // Värdet ska såklart variera från punkt till punkt!
#endif // USE_SEQUENCE
Jag använder en byte för dessa koder då det räcker fint till mig, man kan såklart utöka om man behöver.
Det är i grunden bara en cirkulär buffer, mycket lik den jag använder vid interruptstyrd utskrift. Och nej, det är inte epokgörande - men det kan vara ett trevligt sätt att få koll på att t.ex. ett samspel av hårdvaru-interrupt samspelar rätt och man kan få en idé om var det går fel.
EDIT: Ser att första utläsning blir fel. Får fixa rätt version sen - men principen är OK tycker jag.
EDIT igen: nu fungerar mjukvaran rätt.
Jag ser oftast till att få en fungerande seriell port på ett system, det är mycket bra för att skriva ut meddelanden och värden i debugsyfte. Men jag försöker oftast att använda interruptstyrd utskrift varför en debug-utskrift inifrån en ISR kan låsa allt. Inte bra!
Alltså behövs en möjlighet att samla ihop sekvenserna i någon buffer och sedan skriva ut som vid lämpligt tillfälle. Och det har jag sedan gjort vid att deklarera:
Kod: Markera allt
#define USE_SEQUENCE true
#if USE_SEQUENCE
struct
{
_UWORD Input, Output, Intermediate;
_UBYTE Filled;
_UBYTE Buffer[100];
} Sequence;
void Sequence_Initiate(void)
{
Sequence.Input = 0;
Sequence.Output = 0;
Sequence.Filled = false;
}
int Sequence_Add(_UBYTE Data)
{
if(Sequence.Filled && (Sequence.Input == Sequence.Output)) return(false);
Sequence.Filled = true;
Sequence.Buffer[Sequence.Input++] = Data;
if(Sequence.Input >= sizeof(Sequence.Buffer)) Sequence.Input = 0;
return(true);
}
int Sequence_Check(void)
{ // Something to fetch?
if(Sequence.Filled) return(true);
return(false);
}
_UBYTE Sequence_Get(void)
{
_UBYTE Data;
if(!Sequence_Check()) return(false);
Data = Sequence.Buffer[Sequence.Output++];
if(Sequence.Output >= sizeof(Sequence.Buffer)) Sequence.Output = 0;
if(Sequence.Output == Sequence.Input) Sequence.Filled = false;
return(Data);
}
#endif
Kod: Markera allt
#if USE_SEQUENCE
if(Sequence_Check())
{
// Format printout as required
sprintf(Buffer, "\rSeq:%3u \r\n", Sequence_Get()); RS232_B_Send_Buffer((_UBYTE*)Buffer);
}
#endif // USE_SEQUENCE
#if USE_SEQUENCE
Sequence_Add(18); // Värdet ska såklart variera från punkt till punkt!
#endif // USE_SEQUENCE
Jag använder en byte för dessa koder då det räcker fint till mig, man kan såklart utöka om man behöver.
Det är i grunden bara en cirkulär buffer, mycket lik den jag använder vid interruptstyrd utskrift. Och nej, det är inte epokgörande - men det kan vara ett trevligt sätt att få koll på att t.ex. ett samspel av hårdvaru-interrupt samspelar rätt och man kan få en idé om var det går fel.
EDIT: Ser att första utläsning blir fel. Får fixa rätt version sen - men principen är OK tycker jag.
EDIT igen: nu fungerar mjukvaran rätt.