|
|
  |
Симуляция в IAR, C-spy debugger |
|
|
|
May 1 2005, 18:29
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 26-10-04
Из: Москва
Пользователь №: 988

|
Что-то я не пойму, симулятор в IAR симулирует обвязку или нет. Пробую симулировать таймер. Запускаю, а он стоит. В студии все идет ОК.
|
|
|
|
|
May 1 2005, 21:18
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 23-04-05
Пользователь №: 4 417

|
Скачай с сайта Atmel бесплатную AVRSTUDIO и пользуйся им. Понимает иаровские файлы dbg и симулирует периферию весма прилично.
|
|
|
|
|
May 2 2005, 07:25
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 26-10-04
Из: Москва
Пользователь №: 988

|
Цитата(ssm @ May 2 2005, 00:18) Скачай с сайта Atmel бесплатную AVRSTUDIO и пользуйся им. Понимает иаровские файлы dbg и симулирует периферию весма прилично. Студия есть, только я не понял, она С++ код понимает?
|
|
|
|
|
May 2 2005, 07:26
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 26-10-04
Из: Москва
Пользователь №: 988

|
Цитата(aal @ May 2 2005, 08:09) В иаре хорошо циклы программы проверять, код оптимизировать, проверять правильность работы своих выкрутасов, но с переферией он не дружит.... Что вообще? Тогда зачем он нужен?
|
|
|
|
|
May 3 2005, 06:41
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(DimSun @ May 2 2005, 13:26) Цитата(aal @ May 2 2005, 08:09) В иаре хорошо циклы программы проверять, код оптимизировать, проверять правильность работы своих выкрутасов, но с переферией он не дружит.... Что вообще? Тогда зачем он нужен? В IAR'е есть специальные макросы для эмуляции периферийных устройств. Т.е. не для собственно симуляции того, как, например, таймерный регистр щелкает, а для эмуляции результатов работы периферийных устройств. По опыту скажу, что на деле это ценнее и лучше, нежели простая симуляция периферии, которая только и годится для того, чтобы проверить, а запустился ли таймер. Поясню. Предположим, я отлаживаю протокол обмена через UART, где летают пакеты - загловок, тело, трейлер (контрольная сумма). Вот мне и надо логику отладить. Как это с помощью симулятора сделать? Правильно - написать ему стимул на вход (для UART'а), который изображает всю диаграмму! Не такое простое дело, между прочим. И на деле этого-то мне тут и не надо - мне ведь не правильность работы UART'а надо проверять, а логику работы своего принимающего кода. Поэтому меня бы просто устроила возможность подавать принятые байты на обработчик прерывания. Вот именно это и дает сделать С-SPY: пишу скриптик, где задаю прерывание (с определенным периодом, задержкой и т.д.), задаю immediate breakpoint на обращение к регистру данных UART'а, при котором будет вызван макрос (мною же написанный), где в этот регистр (еще до чтения его процессором) будет подсунуто значение из файла. Таким образом, просто составляю текстовый файл, где просто прописываю байты на прием, и указываю этот файл как входной для симулятора. Все. Та же история с АЦП. Подаю файл с данными и смотрю, как АЦП "оцифровывает" "данные". Очень просто можно смоделировать, например, ситуацию, когда в момент выполнения обработчика прерываний приходит другое прерывание (например, чтобы отследить использование стека в прерываниях) - достаточно задать нужные задержки возникновения прерываний. В общем, макросы эти - очень мощное и гибкое средство моделирования! А для чего еще симулятор нужен?! Именно для моделирования. А уж таймер правильно запустить можно и без симулятора.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 3 2005, 22:22
|
Участник

Группа: Свой
Сообщений: 41
Регистрация: 12-01-05
Из: St. Petersburg
Пользователь №: 1 917

|
Цитата(dxp @ May 3 2005, 09:41) В 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 вылетает с ошибкой. Как правильно сделать ?
|
|
|
|
|
May 4 2005, 04:13
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Ljubitel @ May 4 2005, 04:22) Цитата(dxp @ May 3 2005, 09:41) В 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'никах. Читайте, пробуйте и все получится.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 4 2005, 18:09
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 26-10-04
Из: Москва
Пользователь №: 988

|
Цитата(dxp @ May 3 2005, 09:41) В IAR'е есть специальные макросы для эмуляции периферийных устройств. Т.е. Спасибо, буду разбираться. вообще похоже удобная штука. Мне такое знакомо по Фитоновскому х96. Там правда покруче.
|
|
|
|
|
Feb 14 2009, 10:40
|
Участник

Группа: Новичок
Сообщений: 40
Регистрация: 14-02-09
Пользователь №: 44 853

|
Помогите пожалуйста с макросом вызова прерывания по насчету таймером_1 числа 255 - подробно в топике (сообщение 6) http://electronix.ru/forum/index.php?showtopic=58243Спасибо !
|
|
|
|
|
Feb 14 2009, 13:51
|
Участник

Группа: Новичок
Сообщений: 40
Регистрация: 14-02-09
Пользователь №: 44 853

|
И как запустить счет таймера 1 ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|