Микроконтроллеры | Странное поведение cvavr при инициализации переменных |
|
---|---|---|
Скомпилировал как обычно программу в cvavr 1.25.9, запустил в симуляторе (vmlab) и, ... последний завалил меня сообщениями о нарушении регистра SREG (бит Z: Zero Flag); также симулятор отметил строки с нарушениями, это оказались операции логического сравнения, например: if(j==72) {j=0;} и т.п. и программа запускалась "через раз". Ещё оказалось, что значение переменной, например, j в момент выполнения логической операции почему-то неизвестно и после, SREG - становится испорченным. В программе переменные инициализированы у меня, как обычно делаю, при их объявлении, но получалось, что инициализации при компиляции не происходило. Всё пришло в норму, когда инициализировал переменные в функции main. Так и не понял, почему так стало, ведь переменные же обычно удобнее инициализировать сразу при их объявлении? |
|
|
Компилятор может оптимизировать в том числе и выделение памяти под переменные. Т.е. до момента использования память под них может быть и не выделена, соответственно они не проинициализированны. |
|
|
Digital: Всё пришло в норму, когда инициализировал переменные в функции main. |
|
|
Про глобальные. В общем если галочку "Automatic register allocation" снять (случайно например ), то так получается. Но и с установленной, если переменных много, то SREG нет-нет, да испортится ( в симуляторе по крайней мере). Получается что в main (а не сразу при объявлении) инициализировать глобальные переменные вернее, тогда симулятор не ругается вообще (на одной и той же программе пробовал). Наверное такая особенность cvavr, буду знать теперь . |
|
|
Digital: Получается что в main (а не сразу при объявлении) инициализировать глобальные переменные вернее |
|
|
Zandy: Зачем вобще их инициализировать? Zandy: Вот тут-то и могут пригодиться глобальные переменные опять же для того, чтобы воспользоваться в обработчике прерывания каким-то числом, сформированным в других функциях. Zandy: Если же вы хотите проинициализировать переменную и не менять ее по ходу программы вообще, то это уже будет не переменная, а константа. |
|
|
Мне вот что не понятно. Когда есть нарушение SREG, то cvavr размещает переменные по каким-то адресам или смещениям, непонятно где в общем? См. 1.jpg (34kb). А когда всё нормально, то вот так, с явным указанием регистров (2.jpg 36.5kb). |
|
|
2.jpg |
|
|
Digital: Такое тоже имеется, но сделал как bit, т.к. значение или 0 или 1. |
|
|
А вы знаете, что битовые переменные (записанные, например, как bit х ) доступны только в главной функции? Ни в каких других функциях их использовать нельзя. |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |