[C] embOS mailbox

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Ik heb een probleem met een spel dat ik moet programmeren voor mijn opleiding Embedded Systems. De opdracht is om een spel te maken (MasterMind) met behulp van een RTOS (embOS). Ik gebruik PSoC Creator om te programmeren en een CY8CKIT-046 kit.

Ik heb een taak task_buttons die de knoppen afvraagt, filtert en controleert op een rising edge. Bij een rising edge wordt er een bericht in de mailbox van de UI taak gezet van 2 bytes. De eerste geeft aan dat de taak afkomstig is van de buttons taak en de tweede geeft de button.

De UI taak leest de mailbox uit en behandeld het bericht. Op zich werkt het allemaal prima, alleen één van mijn variabelen (blink_digit) wordt consequent overschreven na 3 keer indrukken van een knop.

De relevante code:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void task_buttons(void)
{
    ...
    char msg[2];
    while (1)
    {
        if (check_edge(filter_button(mfs_get_button(MFS_BUTTON_S1), &filter_inc_button_on, &filter_inc_button_off, &prev_inc_button), &edge_inc_button) == RISING_EDGE)
        {
            msg[0] = UI_MSG_FROM_BUTTON_TASK;
            msg[1] = BUTTON_INC;
            OS_MAILBOX_Put(&task_ui_mailbox, msg);
        }
        ...
        OS_Delay(TASK_BUTTONS_DELAY);
    }
}


C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
uint8 code[] = {1, 1, 1, 1};  
uint8 selected_digit = 0x01; 
uint8 blink_digit = 0x00;

void task_ui(void)
{
    uint8 state = INIT;
    char task_ui_message[2];
    while (1)
    {

        switch (state) { 
            case INIT:
            //generate_code();
            case SELECTION_MODE:
                OS_MAILBOX_GetBlocked(&task_ui_mailbox, task_ui_message);
                switch (task_ui_message[0])
                {
                    case UI_MSG_FROM_BUTTON_TASK:
                        switch (task_ui_message[1])
                        {
                            case BUTTON_INC:
                                selected_digit = selected_digit < NUM_DIGITS ? selected_digit + 1 : 1;
                                break;
                            case BUTTON_DEC:
                                selected_digit = selected_digit > 1 ? selected_digit - 1 : NUM_DIGITS;
                                break;
                            case BUTTON_EDIT:
                                blink_digit = selected_digit;
                                state = EDIT_MODE;
                                break;
                            case BUTTON_ACTION:
                                break;
                            default:
                                break;
                        }
                    default:
                        break;
                }
           case EDIT_MODE:
                OS_MAILBOX_GetBlocked(&task_ui_mailbox, task_ui_message);
                switch (task_ui_message[0])
                {
                    case UI_MSG_FROM_BUTTON_TASK:
                        switch (task_ui_message[1])
                        {
                            case BUTTON_INC:
                                code[selected_digit - 1] = code[selected_digit - 1] < DIGIT_MAX ? code[selected_digit - 1] + 1 : DIGIT_MIN;
                                break;
                            case BUTTON_DEC:
                                code[selected_digit - 1] = code[selected_digit - 1] > DIGIT_MIN ? code[selected_digit - 1] - 1 : DIGIT_MAX;
                                break;
                            case BUTTON_EDIT:
                                blink_digit = 0x00;
                                state = SELECTION_MODE;
                                break;
                            case BUTTON_ACTION:
                                break;
                            default:
                                break;
                        }
                    default:
                        break;
                }
                break;
            case VALIDATE:
            case GAME_LOST:
            case GAME_WON:
                break;
        }
    }
}


Tot dusver heb ik ontdekt dat blink_digit overschreven wordt met de waarde van task_ui_message[0] na 3 keer indrukken van een knop.

Als ik blink_digit initialiseer op een andere waarde dan 0 treedt het probleem niet op. Dit vind ik een zeer interessante ...

Als ik de commentaar maak van de regels 26 EN 51, dan treedt het probleem ook niet op. Als ik 1 van de twee uitschakel treedt het probleem wel op. Deze regels worden echter NOOIT uitgevoerd in mijn tests. Ook deze vind ik interessant ...

Ik krijg de debugger van PSoC Creator niet zo gek om gewoon te stoppen op een breakpoint (zal mijn gebrek zijn), dus dat maakt debuggen niet erg makkelijk.

Iemand enig idee?

You don't have to be crazy to do this job, but it helps ....

Beste antwoord (via Alain op 29-11-2022 11:21)


  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 22:42

DataGhost

iPL dev

Ik ken verder niks van embOS maar als ik in de reference kijk zie ik dat task_ui_mailbox task_ui_message een pointer moet zijn naar een geheugengebied wat groot genoeg is voor jouw mailbox met alle berichten (dus 2*10=20 bytes). Echter zie ik je nergens geheugen allocaten, alleen maar een OS_MAILBOX definiëren zonder grootte dus ik gok dat je gewoon buiten je mailbox loopt te schrijven na 3 berichten. Dan zal je blink_digit precies op een plek staan "vlakbij" je mailbox.

edit: ik keek naar de verkeerde variabele, maar ik zie je definitie van task_ui_message ook nergens staan dus het is nog onduidelijk waar je precies heenschrijft elke keer. Het helpt niet dat je die zo genoemd hebt en dat ook gebruikt voor een daadwerkelijke message, of is het die ene task_ui_message[2] die je daarvoor gebruikt? Want dan is die 18 bytes te klein.

[ Voor 37% gewijzigd door DataGhost op 29-11-2022 11:20 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • eheijnen
  • Registratie: Juli 2008
  • Niet online
Regel 39: ontbreekt na 39 een break?
Regel 13 case INIT: in dit blok staat ook geen break?
Regel 61, 37 ook...

Wie du mir, so ich dir.


Acties:
  • 0 Henk 'm!

  • Springuin
  • Registratie: Juli 2002
  • Laatst online: 14:07
Dit soort dingen kun je ook debuggen door een memory breakpoint te zetten voor een write op die variabele. In de praktijk breakt hij dan op de instructie na de write. Dan kun je zien waar en afleiden waarom er op dat moment geschreven wordt. Of je vervangt all je assignments door een set functie en logt dan via de uart.

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
eheijnen schreef op maandag 28 november 2022 @ 06:52:
Regel 39: ontbreekt na 39 een break?
Regel 13 case INIT: in dit blok staat ook geen break?
Regel 61, 37 ook...
Regel 39 was een copy paste foutje, de overige weet ik van. Voor het probleem maakt het niet uit.
Springuin schreef op maandag 28 november 2022 @ 07:52:
Dit soort dingen kun je ook debuggen door een memory breakpoint te zetten voor een write op die variabele. In de praktijk breakt hij dan op de instructie na de write. Dan kun je zien waar en afleiden waarom er op dat moment geschreven wordt. Of je vervangt all je assignments door een set functie en logt dan via de uart.
Ik zie wel een address breakpoint en een memory watchpoint, maar geen memory breakpoint. Ik zal nog eens verder zoeken.

De terminal heeft me zover gebracht als ik nu ben, maar echt ideaal is het niet om te debuggen.

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Ik mis de relevante definitie van task_ui_mailbox.
Kan je die nog even melden?

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Jazeker kan ik dat:

psoc_mind.h:

C:
1
extern OS_MAILBOX task_ui_mailbox;  


main.c:

C:
1
2
3
4
5
6
7
8
9
10
#include "psoc_mind.h"

OS_MAILBOX task_ui_mailbox;

int main(void)
{

    OS_MAILBOX_Create(&task_ui_mailbox, 2, 10, task_ui_message);

}

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • Springuin
  • Registratie: Juli 2002
  • Laatst online: 14:07
Alain schreef op maandag 28 november 2022 @ 10:05:
[...]
Ik zie wel een address breakpoint en een memory watchpoint, maar geen memory breakpoint. Ik zal nog eens verder zoeken.
Een variable of memory watchpoint is inderdaad hoe PSoC Creator het noemt.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17:05
Als ik je beschrijving van het gedrag lees denk ik meteen aan een buffer under/overflow. Als ik je code zie verdenk ik in eerste instantie
code:
1
uint8 code[] = {1, 1, 1, 1}
array.

Zet eens een guard/assert om
code:
1
code[selected_digit - 1]
om te verifieren dat die *echt* nooit buiten het array komt.

Sowieso zou ik daar altijd checken wat selected_digit was geworden (ooit) voordat ik het array zou indexeren ermee.

Verder zou je nog eens kunnen kijken of je task wel genoeg stack heeft, maar dat zou ik pas daarna doen.

[ Voor 11% gewijzigd door farlane op 28-11-2022 16:02 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
farlane schreef op maandag 28 november 2022 @ 15:53:
Sowieso zou ik daar altijd checken wat selected_digit was geworden (ooit) voordat ik het array zou indexeren ermee.
Ik heb het gecheckt en de index komt niet buiten de array.
Verder zou je nog eens kunnen kijken of je task wel genoeg stack heeft, maar dat zou ik pas daarna doen.
Ik heb de stack nu verhoogt naar 1024 integers. Dat zou volgens mij ruim voldoende moeten zijn, maar helaas geen verbetering.

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Springuin schreef op maandag 28 november 2022 @ 14:59:
[...]

Een variable of memory watchpoint is inderdaad hoe PSoC Creator het noemt.
Het lijkt erop dat mijn dev bordje dit niet ondersteund. Ik krijg de melding:

code:
1
2
3
The run request failed. Encountered error (Warning: Could not insert 
hardware watchpoint 1. Could not insert hardware breakpoints: You may 
have requested too many hardware breakpoints/watchpoints. )

You don't have to be crazy to do this job, but it helps ....


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 22:42

DataGhost

iPL dev

Ik ken verder niks van embOS maar als ik in de reference kijk zie ik dat task_ui_mailbox task_ui_message een pointer moet zijn naar een geheugengebied wat groot genoeg is voor jouw mailbox met alle berichten (dus 2*10=20 bytes). Echter zie ik je nergens geheugen allocaten, alleen maar een OS_MAILBOX definiëren zonder grootte dus ik gok dat je gewoon buiten je mailbox loopt te schrijven na 3 berichten. Dan zal je blink_digit precies op een plek staan "vlakbij" je mailbox.

edit: ik keek naar de verkeerde variabele, maar ik zie je definitie van task_ui_message ook nergens staan dus het is nog onduidelijk waar je precies heenschrijft elke keer. Het helpt niet dat je die zo genoemd hebt en dat ook gebruikt voor een daadwerkelijke message, of is het die ene task_ui_message[2] die je daarvoor gebruikt? Want dan is die 18 bytes te klein.

[ Voor 37% gewijzigd door DataGhost op 29-11-2022 11:20 ]


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
DataGhost schreef op dinsdag 29 november 2022 @ 11:15:
Ik ken verder niks van embOS maar als ik in de reference kijk zie ik dat task_ui_mailbox task_ui_message een pointer moet zijn naar een geheugengebied wat groot genoeg is voor jouw mailbox met alle berichten (dus 2*10=20 bytes). Echter zie ik je nergens geheugen allocaten, alleen maar een OS_MAILBOX definiëren zonder grootte dus ik gok dat je gewoon buiten je mailbox loopt te schrijven na 3 berichten. Dan zal je blink_digit precies op een plek staan "vlakbij" je mailbox.

edit: ik keek naar de verkeerde variabele, maar ik zie je definitie van task_ui_message ook nergens staan dus het is nog onduidelijk waar je precies heenschrijft elke keer.
Je hebt helemaal gelijk! Ik heb hier helemaal overheen gelezen en dacht dat ik alleen voor de message ruimte aan moest maken. Ik snapte ook al niet zo goed waarom ik dit bij OS_MAILBOX_Create() al aan moest geven. Nu is het me wel duidelijk, het is de buffer en niet het bericht.

Probleem opgelost. ;)

Bedankt iedereen en DataGhost in het bijzonder. :)

You don't have to be crazy to do this job, but it helps ....

Pagina: 1