Jump to content

    

DO_SL

Участник
  • Content Count

    14
  • Joined

  • Last visited

Community Reputation

0 Обычный

Информация

  • Город
    Array
  1. Спасибо за помощь. Проверю приведенные выше способы позже, сейчас со временем совсем жестко. Еще раз спасибо всем.
  2. Не силен в теории компиляторов-линковщиков, так что все нижесказанное сугобо ИМХО, если не прав, поправьте пожалуйста. Насколько я понимаю, это только указывает допустимый объем памяти для всего проекта. Работа с внешней xdata по коду на Си ничем не отличается от внутренней. Контроллеру во время инициализации нужно указать, с какой именно памятью работать: только внутренней, только внешней или внешняя+ внутренняя (это все про xdata разумеется). Линковщик про это не знает, он просто размещают переменные в допустимом диапазоне адресов. Мне же как раз и было нужно изменить допустимый диапазон адресов в xdata для конкретных функций, а не для всего проекта целиком. Где это сделать, я так и не нашел (задание именно диапазона, а не конкретного адреса). Пространство адресов xdata нужно было именно уменьшить, а не увеличить. Т.е. внутренняя xdata работает по адресам 0х0000 -- 0х0FFF, внешняя с 0x1000 до 0xFFFF. Тест внешней xdata представляет из себя запись значения по адресу в xdata, чтение значения по этому адресу и сравнение с исходным. Управление микросхемой RAM берет на себя железный модуль в МК. Линковщик при сборке проекта размещал внутренние переменные printf() по адресам старше 0x1000, то есть во внешней микросхеме. Поэтому printf() отрабатывала не корректно (для теста я специально вешал КЗ на соседние выводы внешней микросхемы). Для правильной работы было необходимо, чтобы все переменные, используемые в ходе теста и вывода результатов, размещались в МК (то есть физически в самой микросхеме контроллера). Эмммм. Может я Вас не так понял, если что, поправьте.
  3. Сделал сам. Может кому пригодиться ответ. Как задать область памяти для целого модуля, я не нашел. Зато смог задать размещение переменных конкретной функции. Для моего случая в файл настроек линковщика filename.lin добавил следующую строку: XDATA(?XD?PRINTF?PRINTF(0h), ?XD?_PUTCHAR?PUTCHAR(30h),?XD?_CALCBADRAMPIN?TEST_DIAGNOSTICS(31h), ?XD?_STRCAT?STRCAT(68h)) Можно сделать это же в настройках проекта, вкладка BL51 Locate. В строку XDATA нужно ввести названия сегментов (берутся из filename.m51). Т.е. для моего случая строка будет выглядеть так: ?XD?PRINTF?PRINTF(0h), ?XD?_PUTCHAR?PUTCHAR(30h),?XD?_CALCBADRAMPIN?TEST_DIAGNOSTICS(31h), ?XD?_STRCAT?STRCAT(68h). Соответственно, по аналогии можно задавать адреса и других сегментов. Недостатком такого решения является невозможность (т.е. у меня не получилось) задания допустимого диапазона памяти. Из-за этого приходиться жестко задавать адреса. В случае увеличения объема переменных (актуально для самописных функций) появятся предупреждения о перекрытии адресного пространства. P.S. Заработало!!! :disco:
  4. Делал bootloader для SyLabs C8051F022 в Keil. Проект организовывал так: 1) Проект для самого загрузчика. 2) Проект с полезным кодом. В загрузчике указал располагать код в области памяти начиная с 0xF000 такой директивой линковщику: CODE(0F000h, ?PR?MAIN?UPDATER_F02x(0F000h)). В проекте с полезным кодом вызов загрузчика: void (*update_firmware)(); // pointer to bootloader memory ..... update_firmware = (void code*)0xF000; IE = 0; update_firmware(); // go to bootloader menu При такой организации перекрытие быть может, только если размер полезного кода достигнет адреса 0xF000. Весь же startup code располагается по адресам 0х0000 и 0xF000 для программы и загрузчика соответственно. Правда прерываниями в загрузчике пожертвовал, чтобы не заморачиваться с переопределением векторов. Пример брал из аппнота для силаба. Вдруг поможет. UPD. Да, а зачем Вы объединяете hex-файлы bootloader'a и программы? Я в чистый контроллер заливаю bootloader, переход на него после сброса добавляет сама среда, из bootload'a загружаю саму прошивку (2-й hex-файл). Можно загрузить 2-й hex отладчиком/программатором, но тогда нужно выключить очистку flash перед программирование.
  5. Здравствуйте. Контроллер С8051F022, внешная RAM (xdata), по UART подключен термопринтер (по сути обычный терминал, только вывод на бумагу). Среда разработки KEIL 4.02, BL51.exe v6.22. В проекте после инициализации и перед основным функционалом вызывается функция теста внешней RAM памяти. Сама функция работает, на выходе получаем номер закороченного или не присоединенного вывода. Теперь надо его вывести на термопринтер. Используется для этого printf(). Дальше, уж извините за большое количество букв, опишу все по порядку. 1) В проекте только тест железа, переменные по умолчанию в data (Small memory model в настройках проекта). Все работает. Используется ТОЛЬКО внешняя xdata, встроенная в МК не задействована. 2) Проект растет, small memory model уже мало, ставлю large(variables in xdata). До этого критичные для работы переменные в функции теста внешней RAM принудительно располагаются в data. На выходе функции теста внешней RAM получаю верный ответ, а вот принтер печатает кракозябры. Предполагаемая причина -- внутренние переменные printf() располагаются в битой памяти (внешняя микросхема RAM (xdata)). Переключил режим на совместное использование встроенной в МК xdata (адреса с 0х0000 до 0х0FFF) и внешней микросхемы RAM xdata (адреса с 0х1000 и выше). После этого все заработало. 3) Проект растет не по дням а по часам, внешняя RAM поставлена не для солидности. Объявляется большой массив в xdata. Печать опять кракозябрами. file.m51 TYPE BASE LENGTH RELOCATION SEGMENT NAME -------------------------------------------------------------------- XDATA 8053H 0030H UNIT ?XD?PRINTF?PRINTF XDATA 81FFH 0001H UNIT ?XD?_PUTCHAR?PUTCHAR А теперь собственно вопрос: как указать линкеру область памяти, в которой он может размещать переменные указанных выше функций? Нашел в хелпе следующее: BL51 Putchar.obj & RAMSIZE(128) & CODE(0x0000-0xFFFF) & XDATA(0x0000-0x0FFF) пример Ввел эту строку в linker_control_file.lin, ругается на ошибку. Убрал BL51 -- не помогло. Вообщем вот. Надеюсь на вашу помощь.
  6. То есть? При чем тут InitAll()? Инициализация идентична в обоих версиях. В функции настройка таймеров, прерываний, тактирование портов и задание их режимов.
  7. Проверил следующий вариант, все заработало (т.е. вопрос правильности инцициализации периферии снят) int main(void) { InitAll(); // выполняем инициализацию порта while(1) { if (!(GPIOA -> IDR & GPIO_IDR_IDR8)) { do something } } } Эмм... А не подскажете, как все же сохранить состояние регистра МК в переменной? Операция то типовая. Начал разбираться с STM-кой, вот и натыкаюсь на грабли в самых неожиданный местах. :)
  8. Здравствуйте. Возник следующий вопрос при работе c Keil 4.50: хочу прочитать состояние порта, чтение не дает результатов. int main(void) { uint16_t result = 0; InitAll(); // выполняем инициализацию порта while(1) { result = GPIOA -> IDR & GPIO_IDR_IDR8; } } Компилятор выдает предупреждение: main.c(20): warning: #550-D: variable "result" was set but never used Просмотрел файл линкера Prg_name.map, действительно, под переменную result не выделена память. После объявления переменной как volatile предупреждение не возникает, но память по прежнему не выделяется. Как я понимаю, приводить инициализацию портов нет смысла, ибо на выход все работает, такты подаются, светодиод моргает. При этом в регистре IDR должно быть текущее состояние порта в не зависимости от режима работы. Я прав? Компилятор Keil 4.50, МК STM32F103ZET6. Спасибо за помощь. Да, забыл указать, уровень оптимизации -00.
  9. Отключил WDT сразу в STARTUP. Все остальное вернул к оригинальному виду. Работает. Еще раз спасибо.
  10. Сброс по WDT наступает уже после инициализации регистров. Такой вот вариант не заработал. STARTUP1: ;IF IDATALEN <> 0 ; MOV R0,#IDATALEN - 1 ; CLR A ;IDATALOOP: MOV @R0,A ; DJNZ R0,IDATALOOP ;ENDIF А работать начало после удаления последней строки в STARTUP.A51 ;LJMP ?C_START Вот это-то меня и удивило. При этом main() начинает выполняться. P.S. Чуть позже попробую Ваш вариант с отключением WDT сразу в STARTUP.a51. Спасибо за помощь.
  11. В регистре сброса RSTSRC -- сброс по WDT. Он по умолчанию включен. Выключается в инициализации. Куда, в свою очередь, программа не попадает :) . Вообщем при помощи бубна и с Вашей помощью сделали следующее: влезли в STARTUP, там отключили цикл обнуления регистров памяти (не помогло) и убили последнюю команду "LJMP ?C_START". По идее, она как раз-то и должна вызывать main(). Вот только вызывает она хз что и зачем (программа падает в бесчисленные циклы и потом ресетится по WDT). Если у кого-то есть мысли по этому поводу, отпишитесь. Спасибо.
  12. Здравствуйте, столкнулся со следующей проблемой: компиляция проекта проходит успешно, но про запуске на выполнение (отладка по С2) вместо того чтобы остановиться на main() и ждать дальнейших указаний программа прыгает неизвестно куда и зацикливается. Т.е. СРАЗУ после нажатия на кнопку Start debug session. При этом, если запустит симулятор, все работает как и должно. Т.е. после нажатия на кнопку Start debug session указатель выполняемой инструкции замирает на первой команде в main(). Плата на C8051F361, не сигналовская макетка. Плата проверена, т.к. программа, которая только инициализирует LCD (зажигает подстветку, выводит стартовое меню и т.д.) работала без проблем. Только при добавлении последующих функций возникают проблемы. Есть подозрение, что проблема в файле STARTUP, который добавляет сам Keil. С ним не сталкивался, есть ли смысл лезть туда, если да то как? Суда по дизассемблеру, зацикливание происходит именно там. Еще один вариан -- неверное распределение памяти. В настройках проекта выбран тип Memory model: Large, Code ROM size: LARGE,64KB code. Спасибо.
  13. А в Keil необходимо устанавливать специальные драйверы под С2? Стоит стандартный драйвер Silicon Labs C8051Fxxx Driver. В отличии от Silabs IDE в Keil нет возможности выбора отладочного интерфейса (JTAG/C2). Или я её просто не нашел. P.S. На вкладках Debug и Utilities выбран как раз вышеуказанный драйвер. Спасибо. Все работает. Причиной, скорее всего, были кривые руки).
  14. Здравствуйте. Возник следующий вопрос: возможна ли отладка МК Sygnal в Keil uVision4 по интерфейсу С2? Работаю вот с этим: Keil uVision4 v.9.01, USB debug adapter (SILABS), МК C8051F530A. Другие МК Sygnal по JTAG работают в Keil без проблем. В Silicon Lab. IDE все работает, вот только после Keil к ее и открывать не хочется… Спасибо.