d7d1cd 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Какая же это ошибка. Доступ к любому отдельному байту слова не ошибка, а фича :) То есть, получается так, что я задумывал использовать my_data как хранилище слова (о чем ясно указал - DS16), однако при написании кода я ошибся и обратился к этому слову как к байту. Моя программа в этом случае будет работать не правильно, а компилятор все видит и молчит? Тут все ложится на программиста? Нет средств для контроля? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба однако при написании кода я ошибся и обратился к этому слову как к байту. При написании на ассемблере программисты специально обращаются к байтам слов, чтобы обратиться отдельно либо к младшему, либо к старшему байту, не трогая другой байт, и таким способом экономят что-либо, размер кода например, или время исполнения. А также из таких же соображений обращаются словами сразу к двум специально рядом расположенным байтовым переменным по четному адресу. Ассемблерному программисту не положено по статусу такое делать по ошибке.... Нет средств для контроля? Есть конечно. Сделать эту часть кода на языке высокого уровня, в котором контроль типов более конкретный. PS Смысл в указании DS8/16/32 - чтобы линкер расположил переменную по адресу с корректным выравниваением, чтобы, например, слово, не попало на нечетный адрес. И больше ни для чего Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vazz 0 4 января, 2014 Опубликовано 4 января, 2014 (изменено) · Жалоба А у меня еще один интересный вопрос: можно ли как-то программно прочитать серийный номер МК? Не DeviceID (типа 0x5137 для CC430F5137), а натуральный физический серийник Изменено 4 января, 2014 пользователем vazz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба А вот это ищите в даташите. В некоторых MSP430 есть TLV (Device Descriptor) Structures - там поля lot/wafer ID, wafer X position, wafer Y position, test results - вот их можно с натягом считать неким unique ID. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 5 января, 2014 Опубликовано 5 января, 2014 (изменено) · Жалоба Спасибо за помощь. Но все таки есть метод, позволяющий в какой-то мере отслеживать ошибки, связанные с неправильным обращением к создаваемым переменным. И это касается не только размера этой переменной. Это еще чтение и запись. Для этого надо использовать директивы 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 мне сказал, что есть ограничение на размер и идите лесом... Изменено 5 января, 2014 пользователем d7d1cd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Увы, IAR мне сказал, что есть ограничение на размер и идите лесом... Это верно, ограничение на размер у линкера (xlink), и ему пофигу, на чем исходники был написан и в каких комбинациях. А вот SFRx - они не для переменных придуманы. Это аббревиатура от Special Function Register - для описания регистров, к которым по железным причинам недопустимы какие-то виды операций с какими-то размерами данных. Хотя, конечно, как костыль использовать можно, особенно если размещение переменных по адресам памяти охота вручную делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 5 января, 2014 Опубликовано 5 января, 2014 (изменено) · Жалоба ...особенно если размещение переменных по адресам памяти охота вручную делать. Бывают случаи, что не просто охота, а надо! ;) Я тут добавил кое-что... Изменено 5 января, 2014 пользователем d7d1cd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vazz 0 5 января, 2014 Опубликовано 5 января, 2014 (изменено) · Жалоба Был тут еще вопрос по размеру кода при программировании на ассемблере в версии IAR с ограничением на размер программы. Я использовал готовую прошивку (размером больше 4-х кбайт) и попробовал запустить ее на отладку. Увы, IAR мне сказал, что есть ограничение на размер и идите лесом... В моей нынешней программе около 1кБ кода, для эксперимента еще 4096 байт тупо замостил байтами директивой DB, ничего не ругается, при запуске отладки смотрю содержание FLASH - все вроде ок. Я не могу наверняка сказать, что не использую линкер (потому как не знаю когда он там нужен, вернее догадываюсь, но проверять чо-то не хочется), но походу если не использовать его, то можно и больше 4кБ компилировать. Так? Или я чего-то недопонял опять? :) Или директива DB для читоты эксперимента не катит, нужно именно командами замостить типа NOP? Изменено 5 января, 2014 пользователем vazz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Бывают случаи, что не просто охота, а надо! ;) Честно говоря, именно в контексте MSP430, у которого нет внешней шины, куда может быть что-то снаружи подключено по фиксированным адресам, и в котором нет DMA доступа для кого-то, расположенного снаружи, не верится, что это бывает надо. Все красиво решается средствами ассемблера - RSEG, ASEG, COMMON, и получается при этом максимально перемещаемым. Или директива DB для читоты эксперимента не катит, нужно именно командами замостить типа NOP? да-да. там размер кода ограничен, а не данных. И Вы не можете не использовать линкер. Без него не получите программу, которую можно загрузить в процессор, в том числе и в отладчике, так как именно линкер генерирует на выходе загружаемый исполняемый модуль из "промежуточных" объектных модулей, или одного модуля, полученных в результате работы транслятора ассемблера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vazz 0 5 января, 2014 Опубликовано 5 января, 2014 (изменено) · Жалоба да-да. там размер кода ограничен, а не данных. Замостил 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кБ. Изменено 5 января, 2014 пользователем vazz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Замостил NOP (эквивалент 0x4303, смотрю через отладчик), Ну, возможно, у Вас 8 кбайт ограничение (такое тоже бывает для каких-то семейств), или действительно, вообще при работе с FET ограничений нету. Линкеру никаких не надо дополнительных директив, чтобы знать размер кода - он тупо суммирует размеры всех сегментов, в которых код. после слова Linking И Вы до сих пор утверждаете, что не пользуетесь линкером? :D Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vazz 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба И Вы до сих пор утверждаете, что не пользуетесь линкером? :D Я не могу наверняка сказать, что не использую линкер )) харэ меня пинать этим линкером, ну не понимаю я его прибамбасов (скорее не хочу понимать), мне и без этого нормально живется))) память размечаю в ручную, всегда знаю по какому адресу находятся наиболее важные участки кода, будете смеяться - я в тех.задание на девайс эту карту разметки памяти (и ПЗУ и ОЗУ) тоже включаю и расписываю где что и зачем, не считая комментариев в самой программе. А поповоду 8кБ - проверю и сей момент сейчас. Замощу JMP $ 24кБ, они у меня все равно пустуют, потому как ПО пишу, исходя не из богаства 5137, а из будущей 5133, она вроде подешевле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Смотрите как я получил ограничение. Я создал шаблон проекта на ASM. В качестве отладчика у меня симулятор. Ставлю режим Release, делаю Project - Rebuild All. После этого иду в папку проекта и ищу там скомпилированный файл .a43 (это файл в формате intel hex). Вместо этого файла вставляю другой файл с таким же именем, который содержит скомпилированную большую программу. В проекте делаю Project - Download and Debug и получаю от системы сюрприз: Кроме того потом еще вижу в 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. Все загружается на отладку, однако в окне кода я вижу, что загрузился не только скомпилированный код, но и тот, который был в большом файле. Однако если закрыть симулятор и снова запустить на отладку, то код из большого файла пропадает. Вот так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Это они что-то поднамутили более свежего... Раньше оно еще на этапе компиляции ругалось, что не слинкую Вам ничего, так как кода много. А теперь, смотрю, симулятор ругается... Да и пусть ругается, кому он нужен то, если вся отладка всегда "вживую" на чипе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vazz 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Замостил связкой: JMP $ NOP Пространство с 0x8000 до 0xDFFF (24'576 Байт). Ничего не ругается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться