7 svar
148 visningar
mekatronik behöver inte mer hjälp
mekatronik 625
Postad: 16 aug 2023 10:14

SysTick timer - interrupt funktion

Hej, jag har följande uppgift som jag sitter med just nu:

I denna uppgift ska ett avbrott från SysTick konfigureras och en tillhörande avbrottshanterare konstrueras.
Avbrottet ska genereras kontinuerligt med frekvensen 1000 Hz. Avbrottshanteraren ska uppdatera ett register
(DAC_OUTPUT) med data från en array (samples[]). Vid varje avbrott ska avbrottshanteraren läsa in ett (1)
element från arrayen och skriva till DAC_OUTPUT, vid påföljande avbrott ska nästa element i arrayen läsas in,
osv. När sista elementet har lästs in ska avbrotthanteraren börja om från början av arrayen.

-Konstruera en funktion systick_init() som konfigurerar ett avbrott specfikation ovan.
-Konstruera en funktion systick_irq_handler() som hanterar avbrottet enligt specifikationen
ovan.
Följande definitioner och variabler är givna:
#define DAC_OUTPUT ((int*)0x4000741C)
#define SAMPLE_COUNT 42
int samples[SAMPLE_COUNT];

 

Jag skrev koden i princip exakt som det står i facit, men jag missade en detalj som jag inte riktigt förstår varför den inkluderades. Här är koden:

Förstår inte riktigt varför *((void (**)(void) ) 0x2001C03C ) = systick_irq_handler; finns med i init funktionen, någon som vet vilken funktion den fyller?

Använder denna processor: https://www.cse.chalmers.se/edu/year/2016/course/EDA481_6/Documents/quickguide-mop-vt2016.pdf 

Laguna Online 30210
Postad: 16 aug 2023 14:01

Bland avbrottsvektorerna på sidan 3 är systick med, med värdet 3C. På sidan 3 står att "relokerade avbrottsvektorer" ligger med start på 0x2001C000.

Men det fattas förstås text som beskriver hur det där fungerar.

Laguna Online 30210
Postad: 16 aug 2023 14:16

Men här: https://docplayer.se/34409616-Undantag-avbrott-avsnitt-7-undantag-avbrott.html

mekatronik 625
Postad: 16 aug 2023 15:29
Laguna skrev:

Men här: https://docplayer.se/34409616-Undantag-avbrott-avsnitt-7-undantag-avbrott.html

Snyggt, tack så mycket! Det var lite oklart ja men ser ju nu att vid avbrott används adress mellan 2001 C000 - 2001 C3FF.

Fermatrix 7841 – Fd. Medlem
Postad: 16 aug 2023 20:39 Redigerad: 16 aug 2023 20:39

Ett allmänt tips är att man kan define:a en funktionspekare för att göra syntaxen mindre ful. :)

mekatronik 625
Postad: 16 aug 2023 22:28
Dracaena skrev:

Ett allmänt tips är att man kan define:a en funktionspekare för att göra syntaxen mindre ful. :)

Menar du som facitet jag lista ovanför eller tänkte du på något annat? Jag har märkt att vissa lösningar som lärarna ger har rätt så konstig syntax (ibland).

Fermatrix 7841 – Fd. Medlem
Postad: 16 aug 2023 22:58

Eftersom de addresserna är relativa till hårdvaran är det lite jobbigt att demonstrera just med ditt exempel (så du faktiskt kan köra och se resultatet) men om vi gör ett litet mer allmänt problem:

#include <stdio.h>

typedef int (*SystickHandlerType)(void);

int systick_handler(void);

int systick_handler()
{
    return 19;
}

int main()
{
    SystickHandlerType handler_ptr = systick_handler;

    printf("%d", handler_ptr());

    return 0;
}

Poängen är dock densamma, hoppas det är begripligt hur detta är applicerbart allmänt. :)

mekatronik 625
Postad: 17 aug 2023 16:38
Dracaena skrev:

Eftersom de addresserna är relativa till hårdvaran är det lite jobbigt att demonstrera just med ditt exempel (så du faktiskt kan köra och se resultatet) men om vi gör ett litet mer allmänt problem:

#include <stdio.h>

typedef int (*SystickHandlerType)(void);

int systick_handler(void);

int systick_handler()
{
    return 19;
}

int main()
{
    SystickHandlerType handler_ptr = systick_handler;

    printf("%d", handler_ptr());

    return 0;
}

Poängen är dock densamma, hoppas det är begripligt hur detta är applicerbart allmänt. :)

Ah okej syntaxen är såklart bättre men detta är kanske mer applicerbart för praktiska sammanhang, frågan som jag hade var från en gammal tenta!

Svara
Close