|
Непонятный глюк с прерыванием во Freemodbus |
|
|
|
Jun 13 2008, 15:52
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

|
Нужно реализовать протокол Modbus RTU (в режиме мастера) на AT91SAM7x256. Поначалу пробовала писать свои функции отправки и приема. Но долго мучилась с прерываниями по таймеру и уарту. В конце концов вроде разобралась с ними, но к тому времени пошарила в инете и нашла FreeModbus (для слэйва). Прикрутила к FreeRTOSу. Все отлично работало. Контроллер и принимал, и отсылал назад фрэймы. И прием и передача там организованы на основе перываний от RxD и TxD. Потом стала пытаться преобразовать код для мастера, то бишь сначала отправлять сообщение, а потом ждать ответа. При таком раскладе происходило прерывание на передачу, но только ОДИН раз (и контроллер зависал). Дело, похоже, в том что вызов ф-ии отправки в исходном коде происходит только после приема фрэйма, и массив там используется один, короче, штука вся в указателях... Но не в этом глюк. В один "прекрасный" момент при попытке вернуть все в исходное состояние (то есть обратно в исходный режим слэйва) контроллер стал зависать и после приема фрэйма, то есть там, где раньше работал отлично. Может, кто-то сталкивался с подобным? Может кто-нить пользовался FreeModbus'ом или переделывал его под себя. А использовать его удобно, т к ф-ии все есть и организовано в виде TASK отдельного! ЛЮДИ, ПОМОГИТЕ!!! ВРЕМЯ УТЕКАЕТ, А ПРОБЛЕМА ОСТАЕТСЯ.
Сообщение отредактировал ZAA - Jun 13 2008, 15:53
|
|
|
|
|
 |
Ответов
|
Jun 24 2008, 04:21
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

|
Цитата(aaarrr @ Jun 23 2008, 22:02)  Как именно запрещаете прерывания? Приведите кусочек кода, в котором проявляется проблема. Просто так перелопатить несколько сотен килобайт чужих исходников желающих найдется немного. Ф-ия MAIN Код int main( void ) { prvSetupHardware(); xTaskCreate( vModbus_Task, "modbus", (configMINIMAL_STACK_SIZE*6), NULL, tskIDLE_PRIORITY, NULL );
vTaskStartScheduler();
return 0; } Ф-ия разрешения прерываний по UART Код void UART_INTERRUPT_ENABLE (int RXRDY, int TXRDY) { portENTER_CRITICAL(); if ((RXRDY == 1)&&(TXRDY == 0)) { *AT91C_US0_IER = AT91C_US_RXRDY; *AT91C_US0_IDR = AT91C_US_TXRDY; } else if ((RXRDY == 0)&& (TXRDY == 1)) { *AT91C_US0_IER = AT91C_US_TXRDY; *AT91C_US0_IDR = AT91C_US_RXRDY; } portEXIT_CRITICAL(); } Обработчик прерывания по UART Код void vUART_ISR_Handler( void ) { unsigned int status;
status = AT91C_BASE_US0->US_CSR & AT91C_BASE_US0->US_IMR; if(status & AT91C_US_RXRDY) { if (counter_rcv != 4 ) { massiv[counter_rcv] = uart0_getc(); counter_rcv++; } else { counter_rcv = 0; UART_INTERRUPT_ENABLE(0,1); //Разрешаю прерывание по TXRDY } } if(status & AT91C_US_TXRDY) { if (counter_trsm !=4) { uart0_putc((char) massiv[counter_trsm]); counter_trsm++; } else { counter_trsm = 0; UART_INTERRUPT_ENABLE(1,0); //Разрешаю прерывание по RXRDY } } AT91C_BASE_AIC->AIC_EOICR = 0;
}
|
|
|
|
Сообщений в этой теме
ZAA Непонятный глюк с прерыванием во Freemodbus Jun 13 2008, 15:52 Amper25 Боже, неужели девушки этим занимаются?
Для полно... Jun 13 2008, 21:45 MrYuran Я колупался с freemodbus.
Действительно, очень уд... Jun 14 2008, 05:39 ZAA Цитата(MrYuran @ Jun 14 2008, 08:39)
Де... Jun 15 2008, 13:24 aaarrr Файлы забыли. Jun 15 2008, 13:28 ZAA Цитата(aaarrr @ Jun 15 2008, 16:28) Файлы... Jun 15 2008, 13:44 aaarrr Цитата(ZAA @ Jun 15 2008, 17:24) Простите... Jun 15 2008, 13:55 ZAA Цитата(aaarrr @ Jun 15 2008, 16:55) В арх... Jun 15 2008, 16:54 spf Цитата(ZAA @ Jun 13 2008, 21:52) В конце ... Jun 15 2008, 14:56 ZAA Цитата(spf @ Jun 15 2008, 17:56) Почему в... Jun 15 2008, 15:33 zltigo Цитата(ZAA @ Jun 23 2008, 18:36) Уже неод... Jun 23 2008, 16:45 MrYuran ну а зачем прерывания-то дёргать? пусть себе живут... Jun 23 2008, 16:41 aaarrr Несмотря на некоторую общую кривизну идеи (уж прос... Jun 24 2008, 04:44 ZAA Цитата(aaarrr @ Jun 24 2008, 07:44) Несмо... Jun 24 2008, 07:35 Цырен Народ помогите!
Если вы смогли победить free... Jun 30 2008, 09:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|