2013-04-22 5 views
0

Я программирую на C с использованием Hi-Tech-PICC v9.65PL1 для программирования PIC16F876.Проходящая структура в ISR

Для прерывания Я использую структуру:

void interrupt isr() { 
    if (T0IF) { 
       //Do STUFF 
    T0IF = 0; 
    } 
} 

Я пытаюсь выяснить, как передать объект в ISR. Я знаю, что могу просто сделать объект глобальной переменной, но это не главное. Я видел это в C с другой архитектурой. Так как я использую C, когда я говорю, объект, я имею в виду ЬурейеЕ структуры, такие как:

typedef struct { 
    volatile char state; 
    rtc_t rtc; 
    shiftReg_t shiftReg; 
} clock_t; 

Моя цель состоит в том, чтобы иметь ISR изменить «состояние» в структуре clock_t.

Может кто-нибудь объяснить, что связано с этим?

+0

Как это было сделано на той другой архитектуре, о которой вы говорите? – 2013-04-22 18:12:00

+0

http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/prog/inthandler.html, под заголовком «Обновление общих структур данных» примерно на половину страницы. –

ответ

1

Из того, что я вижу, учитывая, что архитектура не такая уж иная, вам нужно будет выполнить атомную операцию для изменения состояния в структуре clock_t.

Сказали, может void interrupt isr() взять параметр? Если да, то вы можете использовать, используя локальную структуру clock_t, иначе лучшим вариантом было бы перейти с глобальной переменной.

Если ISR действительно примет параметр, вы могли бы пойти, как:

int main() 
{ 
    clock_t noteState; 
    .... 
    isr(&noteState); 
    .... 
} 

и ISR определение, как ::

void interrupt isr(clock_t *tmp) 
{ 
    interruptDisable(); // I am guessing that T0IF is a global value, yes? 
    /* Perform operation */ 
    tmp->state = newState /*(whatever you choose to set)*/ 
    interruptEnable(); 
} 

Вы можете повторно использовать noteState в будущем :)

0

В некоторых случаях обновление переменной в IRQ является «атомарным», если переменную можно обновить в одной инструкции, например, приращение, декремент, только чтение, запись только. Поэтому вам не нужно отключать и разрешать прерывание для кода с открытым кодом в IRQ Handler. Некоторые кодеры OS предоставляют вам функции для этих ситуаций, чтобы убедиться, что переменная обновляется с помощью одной инструкции. Пример функции ОС: http://www.qnx.com/developers/docs/6.3.2/neutrino/lib_ref/a/atomic_add.html

Для некоторых других случаев операции чтения/изменения/записи не являются атомарными на большинстве процессоров (хотя они/являются/атомами на каком-то CISC-процессоре), и нет гарантии атомарности при доступе к нескольким переменным , Для этих случаев перед переменными update enter_critical_section() и после переменных обновлений используются функции exit_critical_section(). Для случаев с не-ОС (без ОС) эти функции сводятся к функциям interruptEnable() и interruptDisable().

 Смежные вопросы

  • Нет связанных вопросов^_^