Перейти к содержанию
    

Симуляция в IAR

Что-то я не пойму, симулятор в IAR симулирует обвязку или нет. Пробую симулировать таймер. Запускаю, а он стоит. В студии все идет ОК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачай с сайта Atmel бесплатную AVRSTUDIO и пользуйся им. Понимает иаровские файлы dbg и симулирует периферию весма прилично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В иаре хорошо циклы программы проверять, код оптимизировать, проверять правильность работы своих выкрутасов, но с переферией он не дружит....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачай с сайта Atmel бесплатную AVRSTUDIO и пользуйся им. Понимает иаровские файлы dbg и симулирует периферию весма прилично.

 

Студия есть, только я не понял, она С++ код понимает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В иаре хорошо циклы программы проверять, код оптимизировать, проверять правильность работы своих выкрутасов, но с переферией он не дружит....

 

Что вообще? Тогда зачем он нужен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В иаре хорошо циклы программы проверять, код оптимизировать, проверять правильность работы своих выкрутасов, но с переферией он не дружит....

 

Что вообще? Тогда зачем он нужен?

В IAR'е есть специальные макросы для эмуляции периферийных устройств. Т.е. не для собственно симуляции того, как, например, таймерный регистр щелкает, а для эмуляции результатов работы периферийных устройств. По опыту скажу, что на деле это ценнее и лучше, нежели простая симуляция периферии, которая только и годится для того, чтобы проверить, а запустился ли таймер.

 

Поясню. Предположим, я отлаживаю протокол обмена через UART, где летают пакеты - загловок, тело, трейлер (контрольная сумма). Вот мне и надо логику отладить. Как это с помощью симулятора сделать? Правильно - написать ему стимул на вход (для UART'а), который изображает всю диаграмму! Не такое простое дело, между прочим. И на деле этого-то мне тут и не надо - мне ведь не правильность работы UART'а надо проверять, а логику работы своего принимающего кода. Поэтому меня бы просто устроила возможность подавать принятые байты на обработчик прерывания. Вот именно это и дает сделать С-SPY: пишу скриптик, где задаю прерывание (с определенным периодом, задержкой и т.д.), задаю immediate breakpoint на обращение к регистру данных UART'а, при котором будет вызван макрос (мною же написанный), где в этот регистр (еще до чтения его процессором) будет подсунуто значение из файла.

 

Таким образом, просто составляю текстовый файл, где просто прописываю байты на прием, и указываю этот файл как входной для симулятора. Все.

 

Та же история с АЦП. Подаю файл с данными и смотрю, как АЦП "оцифровывает" "данные".

 

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

 

В общем, макросы эти - очень мощное и гибкое средство моделирования! А для чего еще симулятор нужен?! Именно для моделирования. А уж таймер правильно запустить можно и без симулятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В IAR'е есть специальные макросы для эмуляции периферийных устройств. Т.е. не для собственно симуляции того, как, например,  таймерный регистр щелкает, а для эмуляции результатов работы периферийных устройств. По опыту скажу, что на деле это ценнее и лучше, нежели простая симуляция периферии, которая только и годится для того, чтобы проверить, а запустился ли таймер.

Вот где бы еще почитать об этом поподробнее,не скажете ?

Скудный хэлп все же в IARе.

Например я хочу периодически менять значение подаваемое на ножку

PIND_Bit2. Пишу макрос.

execUserSetup()
{
   __registerMacroFile("1.mac");
}
__var    i;

execUserReset()
{
   StimulPinD2();
}

StimulPinD2()
{
   while(1)
   {
       for (i = 0;i < 100;i++)
       {
       };
       PIND_Bit2 ^= 1;
   };
}

IAR вылетает с ошибкой.

Как правильно сделать ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В IAR'е есть специальные макросы для эмуляции периферийных устройств. Т.е. не для собственно симуляции того, как, например,  таймерный регистр щелкает, а для эмуляции результатов работы периферийных устройств. По опыту скажу, что на деле это ценнее и лучше, нежели простая симуляция периферии, которая только и годится для того, чтобы проверить, а запустился ли таймер.

Вот где бы еще почитать об этом поподробнее,не скажете ?

Скудный хэлп все же в IARе.

Например я хочу периодически менять значение подаваемое на ножку

PIND_Bit2. Пишу макрос.

[...]

IAR вылетает с ошибкой.

Как правильно сделать ?

Это прерывание? Для эмуляции прерываний существует специальный макрос __orderInterrupt(), где задается периодичность и прочие условия, а также - очень важно - пользовательский макрос, который вызывается в этом

прерывании и выполняет нужную пользователю работу. Вот пример с упомянутым UART'ом:

 

// Setting up a periodic interrupt simulation:

__var UART_Rx_period;
__var UDR;
__var fid;
__var err;

RxIn()
{
   UDR = __readFile(fid);

   __writeMemoryByte (UDR, 0x0c, "I/O-SPACE");

   message "fid = ", fid, "\n";
   message "UDR = ", UDR, "\n";
   __printLastMacroError();
}

execUserSetup()
{
   T_C0_period = 10000;
   UART_Rx_period = 5000;

   __cancelAllInterrupts();        

   __orderInterrupt("USART RXC", 1000, UART_Rx_period, 0, 0, 100); // set T_C0 overflow interrupt

   __setBreak("0x0c", "I/O-SPACE", 1, 1,"", "TRUE", "I", "RxIn()");
       
   err = __openFile(fid, "uart.dat", "r");
   message "fid = ", fid, "\n";
   message "err = ", err, "\n";
}

execUserExit()
{
   __cancelAllInterrupts();
   __closeFile(fid);
}

Здесь с периодом в 1000 тактов будет возникать прерывание "USART RXC", в нем у нас происходит обращение к регистру данных порта - и в этот самый момент, т.е. даже до считывания данных из UDR возникает immediate breakpoint ("I" - в спецификации брейка задает тип оного) - именно в при обращении к адресу UDR, но ДО считывания его значения. При этом вызывается наш макрос RxIn(), где мы и подсовываем значение из файла. Т.е. при считывании в программе из регистра данных UART'а каждый раз получаем следующее значение из файла.

 

Работоспособность именно этого примера не проверял (могут быть мелкие синтаксические огрехи), но почти такое прекрасно работает.

 

Для другого прерывания все делается по аналогии.

 

Все это неплохо описано в документации (не в хелпе, который очень краткий), в pdf'никах. Читайте, пробуйте и все получится. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В IAR'е есть специальные макросы для эмуляции периферийных устройств. Т.е.

 

 

Спасибо, буду разбираться. вообще похоже удобная штука. Мне такое знакомо по Фитоновскому х96. Там правда покруче.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите пожалуйста с макросом вызова прерывания по насчету таймером_1 числа 255 - подробно в топике (сообщение 6)

http://electronix.ru/forum/index.php?showtopic=58243

 

Спасибо !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...