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:
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?
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 ....