Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[NIOSII][MicroC] - Przesyłanie informacji między zadaniami.

ibefree 23 Lis 2014 20:38 477 1
  • #1 23 Lis 2014 20:38
    ibefree
    Poziom 6  

    Witam,

    Na zadanie muszę wykonać prostą imitację sterownika pralki automatycznej na płytce FPGA.

    Sterownik posiada 6 dostepnych funkcji - blokada drzwi, blokada przed zalaniem, blokada przed przegrzaniem, blokada przycisków, poziom detergentu I, poziom detergentu II. Całość ma być sterowana przez Slider Switches, po wybraniu odpowiedniej funkcji zapala się odpowiednia dioda LEDG. Jeżeli nie ma blokady drzwi (SW1) to nie możemy wybierać innych opcji i zapalona jest dioda LEDR.

    Kod wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mamy zrealizować to w ten sposób, że Task1 pobiera informacje o włączonych SW i przesyła je do innych Task'ów, a te kolejno realizują daną funkcję.

    Niestety mój program po wgraniu na płytkę nie robi nic, nie wyświetla niczego na HEX, LCD, nie zapala żadnych diod. Nie mam pojęcia w czym jest problem, a niestety nie mam bezpośredniego dostępu do płytki (zadanie na zajęcia :cry: ), żeby dojść do tego metodą prób i błędów.

    Z góry dziękuję wszystkim za pomoc,

    0 1
  • #2 24 Lis 2014 00:52
    ShinsPL
    Poziom 13  

    1. Sprawdź czy wielkość stosu nie jest za duża (TASK_SIZE). Ja programując na PCecie uC/OS-II miałem ustawione 512 i starczało - możliwe, że jest za mało pamięci, żeby zadania mogły działać.

    2.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    Ten fragment masz wywołany zarówo w sekcji zmiennych globalnych jak i w funkcji main, w związku z tym obie grupy są ze sobą rozłączne - tzn. użycie uchwytLEDG w mainie nie spowoduje żadnej akcji w zmiennej globalnej o tej nazwie. Jeśli chcesz zmieniać zmienną globalną to nie definiuj już tego w mainie + używaj semaforów do blokowania zmiennych globalnych.

    Skoro w mainie chcesz przypisywać do wskaźników jakiś adres i potem używać go w zadaniach to w mainie zrób tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    3.W zadaniach (task1 itd) korzystasz ze zmiennych globalnych bez żadnego zabezpieczenia - to jest niebezpieczne, zanim z nich skorzystasz włącz semafor do blokowania tych zmiennych.

    Żeby program był szybszy dobrze jest, abyś zmienił polecenia
    Kod: c
    Zaloguj się, aby zobaczyć kod
    na
    Kod: c
    Zaloguj się, aby zobaczyć kod
    gdzie TIME będzie przeliczona na ilość cykli zegarowych wartością czasu. Np. przy okresie 5ms czas 100ms to 20 cykli i TIME byłby równy 20.

    0