Перейти к содержанию
    

Какая же это ошибка. Доступ к любому отдельному байту слова не ошибка, а фича :)

То есть, получается так, что я задумывал использовать my_data как хранилище слова (о чем ясно указал - DS16), однако при написании кода я ошибся и обратился к этому слову как к байту. Моя программа в этом случае будет работать не правильно, а компилятор все видит и молчит? Тут все ложится на программиста? Нет средств для контроля?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

однако при написании кода я ошибся и обратился к этому слову как к байту.

 

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

 

Нет средств для контроля?

Есть конечно. Сделать эту часть кода на языке высокого уровня, в котором контроль типов более конкретный.

 

 

PS

Смысл в указании DS8/16/32 - чтобы линкер расположил переменную по адресу с корректным выравниваением, чтобы, например, слово, не попало на нечетный адрес. И больше ни для чего

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у меня еще один интересный вопрос: можно ли как-то программно прочитать серийный номер МК? Не DeviceID (типа 0x5137 для CC430F5137), а натуральный физический серийник

Изменено пользователем vazz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот это ищите в даташите. В некоторых MSP430 есть TLV (Device Descriptor) Structures - там поля lot/wafer ID, wafer X position, wafer Y position, test results - вот их можно с натягом считать неким unique ID.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за помощь. Но все таки есть метод, позволяющий в какой-то мере отслеживать ошибки, связанные с неправильным обращением к создаваемым переменным. И это касается не только размера этой переменной. Это еще чтение и запись. Для этого надо использовать директивы SFRB, SFRW и SFRTYPE. Есть еще SFRL, но почему то эта директива не работает. Наверное она работает с 32-х разрядными микроконтроллерами... Кому надо (новичкам в программировании на ассемблере) привожу пример:

SFRB    AAA = 0x0201                  ; Переменная ААА размером 1 байт по адресу 0х0201
SFRW    BBB = 0x0202                  ; Переменная ВВВ размером 2 байта по адресу 0х0202
SFRTYPE CCC WORD, READ, WRITE = 0x0208; Переменная ССС размером 2 байта (WORD), с возможностью
                                      ; чтения (READ) и записи (WRITE) по адресу 0х0208

main2:   
        MOV     #10, AAA              ; Компилятор ругается (что и требовалось): Accessing SFR using incorrect size
        MOV.B   #10, AAA              ; Теперь все хорошо :)
        
        MOV.B   AAA, BBB              ; Здесь недостаток использования SFR, ведь байт можно переслать в слово, однако ругань
        MOV     #BBB, CCC             ; Перемещение в ССС адреса BBB (0x0202)
        MOV     BBB(R12), CCC         ; Использование ВВВ как массива (R12 - индекс массива)
        MOV     #12, &BBB+2           ; Занесение числа 12 во 2 элемент массива. Здесь компилотор предупреждает: Suspicious sfr expression
                                      ; Нужно обратить внимание, что здесь обязательно
                                      ; использование абсолютного режима адресации. Использование относительного режима
                                      ; адресации приводит к неправильному выполнению кода:
        MOV     #12, BBB+2            ; Помещаем число 12 во 2 элемент массива, однако число 12 попадает по адресу 0х1304, то
                                      ; есть на 0х1100 дальше. Почему так, не знаю...

Был тут еще вопрос по размеру кода при программировании на ассемблере в версии IAR с ограничением на размер программы. Я использовал готовую прошивку (размером больше 4-х кбайт) и попробовал запустить ее на отладку. Увы, IAR мне сказал, что есть ограничение на размер и идите лесом...

Изменено пользователем d7d1cd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увы, IAR мне сказал, что есть ограничение на размер и идите лесом...

Это верно, ограничение на размер у линкера (xlink), и ему пофигу, на чем исходники был написан и в каких комбинациях.

 

А вот SFRx - они не для переменных придуманы. Это аббревиатура от Special Function Register - для описания регистров, к которым по железным причинам недопустимы какие-то виды операций с какими-то размерами данных. Хотя, конечно, как костыль использовать можно, особенно если размещение переменных по адресам памяти охота вручную делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...особенно если размещение переменных по адресам памяти охота вручную делать.

Бывают случаи, что не просто охота, а надо! ;)

 

Я тут добавил кое-что...

Изменено пользователем d7d1cd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был тут еще вопрос по размеру кода при программировании на ассемблере в версии IAR с ограничением на размер программы. Я использовал готовую прошивку (размером больше 4-х кбайт) и попробовал запустить ее на отладку. Увы, IAR мне сказал, что есть ограничение на размер и идите лесом...

 

В моей нынешней программе около 1кБ кода, для эксперимента еще 4096 байт тупо замостил байтами директивой DB, ничего не ругается, при запуске отладки смотрю содержание FLASH - все вроде ок. Я не могу наверняка сказать, что не использую линкер (потому как не знаю когда он там нужен, вернее догадываюсь, но проверять чо-то не хочется), но походу если не использовать его, то можно и больше 4кБ компилировать. Так? Или я чего-то недопонял опять? :) Или директива DB для читоты эксперимента не катит, нужно именно командами замостить типа NOP?

Изменено пользователем vazz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бывают случаи, что не просто охота, а надо! ;)

 

Честно говоря, именно в контексте MSP430, у которого нет внешней шины, куда может быть что-то снаружи подключено по фиксированным адресам, и в котором нет DMA доступа для кого-то, расположенного снаружи, не верится, что это бывает надо. Все красиво решается средствами ассемблера - RSEG, ASEG, COMMON, и получается при этом максимально перемещаемым.

 

Или директива DB для читоты эксперимента не катит, нужно именно командами замостить типа NOP?

 

да-да. там размер кода ограничен, а не данных. И Вы не можете не использовать линкер. Без него не получите программу, которую можно загрузить в процессор, в том числе и в отладчике, так как именно линкер генерирует на выходе загружаемый исполняемый модуль из "промежуточных" объектных модулей, или одного модуля, полученных в результате работы транслятора ассемблера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да-да. там размер кода ограничен, а не данных.

 

Замостил NOP (эквивалент 0x4303, смотрю через отладчик), начиная от 0xEF3C до 0xFF3C (4096 байт), плюс как и говорил около 1кБ своего кода. Также все ок. Э... хм... я что-то не так делаю? Или всеже PUBLIC/EXTERN в данном случае помогают линкеру понять сколько программного кода написано? Или может фирменный FET как-то влияет? Я уже начал "привыкать" к иару, а пиратить ничего не хочется. Варианты подскажите как еще его проверить на ограничение?

 

У меня вот такие сообщения пишет (после чего успешно запускается отладчик):

 

Building configuration: CC430F5137-E - Debug

Updating build tree...

Linking

 

Total number of errors: 0

Total number of warnings: 0

 

Может у кого после слова Linking что-то пишется вообще? Я имею в виду даже при компиляции программы размером менее 4кБ.

Изменено пользователем vazz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Замостил NOP (эквивалент 0x4303, смотрю через отладчик),

Ну, возможно, у Вас 8 кбайт ограничение (такое тоже бывает для каких-то семейств), или действительно, вообще при работе с FET ограничений нету. Линкеру никаких не надо дополнительных директив, чтобы знать размер кода - он тупо суммирует размеры всех сегментов, в которых код.

 

после слова Linking

И Вы до сих пор утверждаете, что не пользуетесь линкером? :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И Вы до сих пор утверждаете, что не пользуетесь линкером? :D

 

Я не могу наверняка сказать, что не использую линкер )) харэ меня пинать этим линкером, ну не понимаю я его прибамбасов (скорее не хочу понимать), мне и без этого нормально живется))) память размечаю в ручную, всегда знаю по какому адресу находятся наиболее важные участки кода, будете смеяться - я в тех.задание на девайс эту карту разметки памяти (и ПЗУ и ОЗУ) тоже включаю и расписываю где что и зачем, не считая комментариев в самой программе.

 

А поповоду 8кБ - проверю и сей момент сейчас. Замощу JMP $ 24кБ, они у меня все равно пустуют, потому как ПО пишу, исходя не из богаства 5137, а из будущей 5133, она вроде подешевле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите как я получил ограничение. Я создал шаблон проекта на ASM. В качестве отладчика у меня симулятор. Ставлю режим Release, делаю Project - Rebuild All. После этого иду в папку проекта и ищу там скомпилированный файл .a43 (это файл в формате intel hex). Вместо этого файла вставляю другой файл с таким же именем, который содержит скомпилированную большую программу. В проекте делаю Project - Download and Debug и получаю от системы сюрприз:

image-60F2_52C96A12.jpg

 

Кроме того потом еще вижу в Debug Log:

Sun Jan 05, 2014 18:15:37: Using license: Standalone license - IAR Embedded Workbench for Texas Instruments MSP430, 4K KickStart Edition 5.60

Sun Jan 05, 2014 18:16:32: User error: Your application is too large. This version of IAR Embedded Workbench has a code limitation of 4096 bytes.

 

Однако дальше становится еще интереснее. После всех выше описанных действий я делаю Project - Rebuild All и Project - Download and Debug. Все загружается на отладку, однако в окне кода я вижу, что загрузился не только скомпилированный код, но и тот, который был в большом файле. Однако если закрыть симулятор и снова запустить на отладку, то код из большого файла пропадает. Вот так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это они что-то поднамутили более свежего... Раньше оно еще на этапе компиляции ругалось, что не слинкую Вам ничего, так как кода много. А теперь, смотрю, симулятор ругается... Да и пусть ругается, кому он нужен то, если вся отладка всегда "вживую" на чипе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Замостил связкой:

 

JMP   $
NOP

 

Пространство с 0x8000 до 0xDFFF (24'576 Байт). Ничего не ругается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...