Показано с 1 по 10 из 1174

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Панель приборов.

    Так вроде как после обработки прерывания контроллер продолжит выполнение с того места где был прерван. Потому что при переходе на прерывание адрес сохраняется в стеке
    Последний раз редактировалось Chip; 04.12.2009 в 01:03.

  2. #2
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

    По умолчанию Re: Панель приборов.

    Цитата Сообщение от Chip Посмотреть сообщение
    Так вроде как после обработки прерывания контроллер продолжит выполнение с того места где был прерван. Потому что при переходе на прерывание адрес сохраняется в стеке
    Тут дело в том, что переменная ptl, с которой происходит работа не 1-байтная. Поэтому загрузка ее в стек или в регистры (что более вероятно для этих контроллеров) для вызова функции происходит за несколько команд. Существует вероятность, что в течении этих команд произойдет вызов прерывания. И это может изменить часть содержимого, загружаемого в стек. А может также сыграть при очистке.

    Пример - пусть переменная
    uint16 volatile tpl
    (volatile - чтобы в памяти была, иначе может оказаться в регистрах, тогда код будет чуть другой, но суть останется той же)
    В ней находится какое-то значение. Происходит вызов функции, который внутри представляет последовательное чтение памяти и занесение ее в регистры

    Выглядит это примерно так
    LDD R24,Y+1 Load indirect with displacement - первый байт
    LDD R25,Y+2 Load indirect with displacement - второй байт
    CALL 0x0000010C Call subroutine

    Потом очищение
    тоже последовательными записями в память
    LDI R24,0x00 Load immediate - загрузили 0 в регистр
    STD Y+1,R24 Store indirect with displacement записали первый 0
    STD Y+2,R24 Store indirect with displacement записали второй 0

    Есть почти нулевая вероятность в момент считывания или записи значения только наполовину, получить прерывание, которое изменит содержимое памяти, причем обеих половинок!
    Грубо говоря, в результате можно получить ситуацию, при которой первая половина уже обнулена, в этот момент вызывается прерывание, которое прописывает данные в ОБА байта памяти, а потом срабатывает второй STD и записывает 0 во второй байт памяти.

    В результате у нас в переменной получится очень странное значение с точки зрения кода. Причем это будет крайне редкая ситуация, которую сымитировать невозможно.

    Это я говорю как человек, собаку съевший на одновременном доступе к памяти, правда на x86 и многозадачности. Там все строго - пока переменная умещается в регистр и операция с ней производится за одну команду - делай с нейй почти чего хочешь (но все равно - в рамочках!). Но попробуешь такой финт провернуть с int64 - сходу можешь такого огрести... Там для этого существуют критические секции. Тут критических секций нет, но поскольку задержка в 10-20 тактов для прерываний не критична, можно спокойно вырубить прерывания на время прохождения такого куска.

    UPD:
    2 Chip: в обработке прерывания нет смысла выключать прерывания, это и так делает сам микроконтрорллер.
    Вот кусок описания прерываний AVR
    When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled. The user software can write logic one to the I-bit to enable nested interrupts. All enabled interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a Return from Interrupt instruction – RETI – is executed.
    Последний раз редактировалось SBorovkov; 04.12.2009 в 05:22.

  3. #3
    Новичок
    Регистрация
    19.12.2009
    Сообщений
    6
    Вес репутации
    179

    По умолчанию Re: Панель приборов.

    Подключение датчиков (тормоза, поворотники... (+) ) через транзисторы, как по схемам Urvin ?

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •