реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как оптимизация влияет на работу портов ВВ?
Sirko
сообщение Dec 4 2010, 21:03
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Чип - mega128.
Для связи с внешним миром на PORTB нацеплены несколько регистров-защелок.
С других пинов других портов идут стробы для каждой из защелок.
Инициализацию портов делаю единожды, при старте. Но, оказывается, регистр DDR где-то сбрасывается.
Перекопал весь код, закоментировал все лишнее.
После того, как разбил лоб в поисках проблемы, выявил, что ее можно победить двумя способами:
1. непосредственно перед использованием пина записывать "1" в его DDR;
2. отключить оптимизацию (чито случайно попробовал, никогда ни подумал бы).

Использую scmRTOS, копилятор GCC, make из операционки.

Инициализация вот такая:
Код
SMH_InputsOutputs::
SMH_InputsOutputs(OS::TMutex* pMutex) : mutex(pMutex){
    DRIVER(PIN_STNDBY,  OUT);
    DRIVER(PIN_TSTRD,  OUT);
    DRIVER(PIN_KBDRD,  OUT);
    DRIVER(PIN_RKRD,  OUT);
    DRIVER(PIN_RKWR,  OUT);
    DRIVER(PIN_DRS,  OUT);
    DRIVER(PIN_DEN,  OUT);
    OFF(PIN_STNDBY);
    ON(PIN_TSTRD);
    ON(PIN_KBDRD);
    ON(PIN_RKRD);
    ON(PIN_RKWR);
    ON(PIN_DRS);
    ON(PIN_DEN);
    outputs = 0;

}

проблема вот здесь:
Код
void SMH_InputsOutputs::
handler(void){

    mutex->Lock();

    // Опрос внешних входов DIN0 - DIN7
    SET_DATA_BUS_READ_MODE;
    OFF(PIN_RKRD);
//DRIVER(PIN_RKRD,    OUT);    //?????????? Не знаю, где сбрасывается DDRE5
    inputs0_7 = GET_DATA_BUS;    //    Сохранить результат с защелки
    ON(PIN_RKRD);


    // Установка внешних выходов
    SET_DATA_BUS_WRITE_MODE;        //    Перевести порт данных в режим "передача"
    SET_DATA_BUS = outputs;
    OFF(PIN_RKWR);
    ON(PIN_RKWR);
    SET_DATA_BUS_READ_MODE;



    mutex->Unlock();
}


Если раскоментировать строку
//DRIVER(PIN_RKRD, OUT); //??????????
проблема решается, а если ее же передвинуть выше на одну строку, то нифига не работает.
Ну или отключить оптимизацию, то эта строка вовсе не нужна.

Если есть мысли, поделитесь, пожалуйста.


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 5 2010, 00:47
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Sirko @ Dec 4 2010, 23:03) *
Если есть мысли, поделитесь, пожалуйста.
Чудес не бывает. Можно предположить, что какому-либо из процессов не хватает стека и он налезает на область РОН, портя их, в том числе и DDR. Можно предположить, что какому-то из процессов не хватает стека и он налезает на какой-то из указателей и портит его. А потом, обращаясь через этот указатель, вы портите DDR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Sirko
сообщение Dec 5 2010, 08:43
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Всем спасибо. Все разрулилось.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 09:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016