|
возврат параметров из прерывания, как передать измененные переменные из прерывания в программу |
|
|
|
Mar 1 2011, 17:28
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 15-08-06
Из: Москва
Пользователь №: 19 556

|
Всем привет! заметил странную особенность в программировании NIOSII. При вызове обработчика прерывания передаю ему контекст в виде переменной, похоже он передается по значению, поэтому переменная не меняется при возврате в программу. Ну это еще ладно, я изменяю значение глобальной переменной в обработчике прерывания, по возврату из прерывания ее значение не меняется. И самый прикол, такое ощущение, что при обращении к глобальной переменной в обработчике создается постоянная переменная, которая видна только в обработчике прерывания. Кто нибудь может прокомментировать такое поведение? Как мне вернуть переменную из обработчика прерывания?
#include "system.h" #include "alt_types.h" #include "altera_avalon_pio_regs.h" #include "sys/alt_irq.h"
alt_u8 led = 0x0; volatile int i,j;
static void timer_0_isr (void* context){ led++; IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, led); IOWR_16DIRECT(TIMER_0_BASE, 0, 0); }
int main(void) { IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_BASE, 0xf); alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ, timer_0_isr, led, 0);
while(1){ for(i = 0; i < 5000000; i++); led = 0; IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, led); } return 0; }
Сообщение отредактировал robix - Mar 1 2011, 17:30
|
|
|
|
|
 |
Ответов
|
Mar 2 2011, 12:41
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(robix @ Mar 2 2011, 18:30)  Всем спасибо. Пока вышел из ситуации использованием объявления переменной с volatile. Но, как я понял, эта проблема (c volatile) относится не только к прерываниям. Как понять когда его нужно использовать когда нет!? Не совсем то, но в тему из NII software developers handbook Код For C programmers, note that declaring a pointer as volatile does not
cause accesses using that volatile pointer to bypass the data cache. The volatile keyword only prevents the compiler from optimizing out accesses using the pointer.
This volatile behavior is different from the methodology for the first-generation Nios processor. И, кажется, еще где-то видел (могу ошибаться), но как я понял слово volatile не всегда спасает от считывания старой (не актуальной) величины из кэша. Если ошибаюсь - поправьте, самому интересно.
|
|
|
|
Сообщений в этой теме
robix возврат параметров из прерывания Mar 1 2011, 17:28 sergeeff Что-то мутное у вас многое в программе.
1. Функци... Mar 1 2011, 18:23 vadimuzzz Цитата(sergeeff @ Mar 2 2011, 00:23) 1. Ф... Mar 2 2011, 02:46 sergeeff Да уж, NIOS II это круто.
В функции
Кодextern i... Mar 2 2011, 07:40 ViKo С NIOS не знаком. Но, как и sergeeff, недоумеваю. ... Mar 2 2011, 08:16 vadimuzzz Цитата(ViKo @ Mar 2 2011, 14:16) Как в пр... Mar 2 2011, 08:47 robix Цитата(ViKo @ Mar 2 2011, 11:16) С NIOS н... Mar 2 2011, 08:48        vadimuzzz Цитата(alexPec @ Mar 3 2011, 20:28) А ста... Mar 3 2011, 15:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|