Jump to content

    

vovken1997

Участник
  • Content Count

    18
  • Joined

  • Last visited

Community Reputation

0 Обычный

About vovken1997

  • Rank
    Участник
  1. Прошивка скомпилировалась и слинковалась! Компилятор: XC8 v1.37 (PRO mode) - бесплатная лицензия от Microchip на 60 дней Среда разработки: MPLAB X IDE v3.25 Проблема была в том, что память в этом микроконтроллере разделена на 4 страницы, каждая страница 2К слова (если нужно перейти по адресу, находящемуся на другой странице, то необходима дополнительная команда смены страницы). Компилятор подготавливает так называемые psect (раздел памяти) в которых объединены функции. Если я правильно понимаю, то это такие своеобразные "чёрные ящики", которые компилятор отдаёт линковщику в виде объектных файлов, чтобы тот их разместил в памяти. Так как эти объектные файлы не могут находиться на стыке двух страниц, то есть пересекать их, то может возникнуть ситуация, когда памяти вроде бы хватает, но линковщик отказывается размещать "чёрные ящики", говоря, что максимальная не занятая область внутри страниц меньше, чем то, что необходимо разместить. Следовательно чтобы решить данную проблему, необходимо разбить "чёрные ящики" на части. Я это сделал при помощи спецификатора __section(), который добавил у больших функций, чтобы компилятор подготовил для них отдельный psect и линковщик мог разместить их в памяти по своему желанию. Да, при использовании данного метода, у меня съелось около 160 слов. Они были использованы компилятором для смены страниц при переходах. Собственно вот пример: void __section("main") main (void) { ... } byte __section("settings") my_settings(byte mod){ ... } Ну и позволю себе привести цитату из документации на компилятор: Если кто то знает другое решение данной проблемы, прошу сообщить мне об этом. Спасибо большое за помощь zltigo и остальным!
  2. Не ломающийся загрузчик (в моём понимании) - это загрузчик, который не может сам себя перезатереть при программировании И не дать себя перезатереть программе, которой отдал управление. Такой загрузчик если и зависнет при прошивке по каким то обстоятельствам, то передёргивание питания всё должно вернуть на место. Другими совами ему ничего не должно быть страшно и, следовательно, он должен без посредников получать управление чтобы корявый загружаемый код (возможно даже нацеленный на поломку устройства), не смог ничего попортить. Делается такая защита при помощи конфигурационных бит, которые указываются при прошивке программатором. Эти биты защищают какую то часть программы от перезаписи самой программой. Например в pic16f1825 можно либо вообще не защитить, либо защитить 0x200, либо 0x1000, либо всю. У меня стоит защита 0x200, следовательно первые 512 слов сама программа не может перезаписать. Это отдельно проверял, команды на стирание отправляются, а страница остаётся невредима. Но тем ни менее моя проблема так и не решена! Есть загрузчик, но нет возможности сделать прошивку. Столько про эти загрузчики разговоров в сети, неужели никто не загружал код, который занимает много памяти?
  3. Да, хороший способ. Но очень ненадежный... Не защищены ни первые четыре слова, ни последние. Если сломался загрузчик у человека, у которого нет программатора, устройство можно выкинуть...
  4. Спасибо! Вчера пытался разбить на 20 подфункций. Ничего не получилось, все также ошибка при смещении... Неужели ни у кого не было такой проблемы???
  5. varostov, к сожалению размещать загрузчик "на чердаке" я не могу, так как эта область не защищается аппаратно и я использую прерывания, которые бы не хотелось передавать через программу. Загрузчик я писал сам из-за достаточно уникальной задачи.
  6. Спасибо за ценный ответ. Посмотрел map при смещении на 150: Name Link Load Length Selector Space Scale C:\Users\NIR\AppData\Local\Temp\s71g.obj end_init 285 285 2 2A8 0 reset_vec 150 150 2 2A0 0 config 8007 8007 2 1000E 0 dist/default/production\medic.X.production.obj cinit 951 951 6AF 12A2 0 intentry 154 154 131 2A8 0 text54 764 764 15 2A8 0 text41 287 287 4DD 2A8 0 text12 858 858 F9 10B0 0 text11 1990 1990 670 3320 0 cstackBANK0 20 20 33 20 1 cstackCOMMON 70 70 B 70 1 clrtext 779 779 C 2A8 0 bssBANK2 120 120 28 120 1 bssBANK1 A0 A0 46 A0 1 dataBANK0 6C 6C 4 20 1 bssBANK0 53 53 19 20 1 bssCOMMON 7B 7B 3 70 1 stringtext 1000 1000 6BE 20 0 Psect | Contents | Memory Range | Size ------------|--------------------------------|---------------|-------------- | | | reset_vec | Reset vector | 0150h - 0151h | 2 words intentry | Interrupt context entry code | 0154h - 0284h | 305 words end_init | Initialization code | 0285h - 0286h | 2 words text41 | Program and library code | 0287h - 0763h | 1245 words text54 | Program and library code | 0764h - 0778h | 21 words clrtext | Memory clearing code | 0779h - 0784h | 12 words text12 | Program and library code | 0858h - 0950h | 249 words cinit Microchip MPLAB XC8 C Compiler (PRO Mode) V1.33 Program space: CONST used 0h ( 0) of 1EB0h words ( 0.0%) CODE used 144Bh ( 5195) of 1EB0h words ( 66.1%) STRCODE used 6BEh ( 1726) of 1EB0h words ( 22.0%) ENTRY used 0h ( 0) of 1EB0h words ( 0.0%) STRING used 0h ( 0) of 1EB0h words ( 0.0%) Memory Summary: Program space used 1B09h ( 6921) of 2000h words ( 84.5%)... Видно, что смещение происходит и на нужную величину. Так же памяти у него достаточно, около 1000 слов, а надо всего 512. Настораживает строчка: hlink "--edf=C:\Program Files (x86)\Microchip\xc8\v1.33\dat\en_msgs.txt" -cs -h+dist/default/production\medic.X.production.sym --cmf=dist/default/production\medic.X.production.cmf -z -Q16F1825 -oC:\Users\NIR\AppData\Local\Temp\s8m8.6 -Mdist/default/production/medic.X.production.map -ver=XC8#PRO##V1.33 -ASTACK=020C8h-0225fh -pstack=STACK -ACONST=0150h-01FFh,0200h-02FFhx30 -ACODE=0150h-07FFh,0800h-0FFFhx3 -ASTRCODE=0150h-01FFFh -AENTRY=0150h-01FFh,0200h-02FFhx30 -ASTRING=0150h-01FFh,0200h-02FFhx30 -ACOMMON=070h-07Fh -ABANK0=020h-06Fh -ABANK1=0A0h-0EFh -ABANK2=0120h-016Fh -ABANK3=01A0h-01EFh -ABANK4=0220h-026Fh -ABANK5=02A0h-02EFh -ABANK6=0320h-036Fh -ABANK7=03A0h-03EFh -ABANK8=0420h-046Fh -ABANK9=04A0h-04EFh -ABANK10=0520h-056Fh -ABANK11=05A0h-05EFh -ABANK12=0620h-064Fh -ABIGRAM=02000h-023EFh -ARAM=020h-06Fh,0A0h-0EFh,0120h-016Fh,01A0h-01EFh,0220h-026Fh,02A0h-02EFh,0320h-036Fh,03A0h-03EFh,0420h-046Fh,04A0h-04EFh,0520h-056Fh,05A0h-05EFh,0620h-064Fh -AABS1=020h-07Fh,0A0h-0EFh,0120h-016Fh,01A0h-01EFh,0220h-026Fh,02A0h-02EFh,0320h-036Fh,03A0h-03EFh,0420h-046Fh,04A0h-04EFh,0520h-056Fh,05A0h-05EFh,0620h-064Fh -ASFR0=00h-01Fh -ASFR1=080h-09Fh -ASFR2=0100h-011Fh -ASFR3=0180h-019Fh -ASFR4=0200h-021Fh -ASFR5=0280h-029Fh -ASFR6=0300h-031Fh -ASFR7=0380h-039Fh -ASFR8=0400h-041Fh -ASFR9=0480h-049Fh -ASFR10=0500h-051Fh -ASFR11=0580h-059Fh -ASFR12=0600h-061Fh -ASFR13=0680h-06EFh -ASFR14=0700h-076Fh -ASFR15=0780h-07EFh -ASFR16=0800h-086Fh -ASFR17=0880h-08EFh -ASFR18=0900h-096Fh -ASFR19=0980h-09EFh -ASFR20=0A00h-0A6Fh -ASFR21=0A80h-0AEFh -ASFR22=0B00h-0B6Fh -ASFR23=0B80h-0BEFh -ASFR24=0C00h-0C6Fh -ASFR25=0C80h-0CEFh -ASFR26=0D00h-0D6Fh -ASFR27=0D80h-0DEFh -ASFR28=0E00h-0E6Fh -ASFR29=0E80h-0EEFh -ASFR30=0F00h-0F6Fh -ASFR31=0F80h-0FEFh -preset_vec=0150h,intentry=0154h,init,end_init -ppowerup=CODE -pcinit=CODE -pfunctab=CODE -ACONFIG=08007h-08008h -pconfig=CONFIG -DCONFIG=2 -AIDLOC=08000h-08003h -pidloc=IDLOC -DIDLOC=2 -AEEDATA=00h-0FFh/0F000h -peeprom_data=EEDATA -DEEDATA=2 -DCODE=2 -DSTRCODE=2 -DSTRING=2 -DCONST=2 -DENTRY=2 -k C:\Users\NIR\AppData\Local\Temp\s8m8.obj dist/default/production\medic.X.production.obj А именно -ACODE=0150h-07FFh,0800h-0FFFhx3 -ASTRCODE=0150h-01FFFh. Почему то класс кода делится на сегменты, один от 150 до 800, а остальные по 2к. слова далее до конца. При смещении на 200, линковщик после выше указанного текста hlink... выдаёт ошибку 0: (1347) can't find 0x58F words (0x58f withtotal) for psect "text41" in class "CODE" (largest unused contiguous range 0x493). Да, после изменения смещения параметр в линковщике меняется на -ACODE=0200h-07FFh,0800h-0FFFhx3. К сожалению я не знаю, возможно ли вручную задать -ACODE=0200h-1FFF и будет ли это иметь какой то смысл, но это единственная моя догадка на данный момент. Если не сложно, подскажите пожалуйста. Добавлено: Нашёл такой текст в документации: На сколько я понимаю, предлагается разбивать функции или же редактировать параметры линковщика. Я изменил параметр линковщика на -L-ACODE=0200h-07FFh,800h-1FFFh (это вставил в Additional option в настройках проекта XC8 Linker). В map файле проверил что установил правильно, проект скомпилировался. Когда добавил смещение, то получил новую ошибку: 1297: (1357) fixup overflow storing 0x92D in 2 bytes at 0x3254/0x2 -> 0x192A (dist/default/production\medic.X.production.obj 232/0x24) Что это то такое?
  7. Здравствуйте! Мне не удаётся скомпилировать прошивку для pic16f1825 компилятором xc8 (PRO mode) после того, как указываю codeoffset на 512 слов (в этой области загрузчик). При обычной компиляции (без смещения) пишет 85% занято, бутлоадер занимает 7%. Экспериментировал с различными значениями codeoffset, максимальное смещение при котором он ещё компилируется 340 слов, при чем если посмотреть код программы, то там остаётся куча незанятого места. Есть ли какая нибудь возможность заставить компилятор скомпоновать код и создать hex со смещением.
  8. Здравствуйте! Мне необходимо подключить данный модуль к микроконтроллеру PIC16F1824, таким образом, чтоб была возможность выхода в интернет. В даташите написано что для работы GPRS необходимо включить class 8 или 10. А за ними в скобочках 3Rx/2Tx. Это получается что для работы с интернетом необходимо задействовать 5 портов и работать ассинхронно? И если я правильно понимаю, то остальные 3 порта которыми необходимо связать пик с висмо, кроме RX/TX, это RTS, CTS и DTR? И к каким поратм PIC тогда разумнее подключить, чтоб не загромождать код программы отслеживанием посылок? Объясните пожалуйста!
  9. Здравствуйте! Если у кого нибуть есть модель SIM гнезда на 6 пинов для Altium скиньте пожалуйста. Желательно разьём типа SIMMP-00601B201-G. Спасибо!
  10. Расскажите. Большая скорость мне не нужна. Не куда гнаться. Да и данных не очень много будет. Главное чтоб передовалось.
  11. Блин, опять 10 постов и по поводу кварца и режима работы. Есть ли у кого этот конвертер для Altium Designer???
  12. Моё затруднение с этим проектом связано в том, что я ни разу ничего с МК в ПК не передавал. Пока в принципе всё понятно, хочу для начала схему в Альтиуме составить и платку развести, ну а потом видно будет. Изначальный вопрос заключался в том, сколько контактов подключить. На него ответили. Да, можете скинуть библиотеку компонентов под альтиум, где есть CP2102???
  13. O.L., спасибо за код! Хоть до этого пока даликовата, но общие представления я получил.
  14. Ребят, я просто спросил, как реализовать ПРОГРАМНО передачу по UART в 11 посте!!! Прочитав всё, я так и не увидел ответа...
  15. Блин, перепроверил, точно PIC12F629. Не хочется позорится, но я не знаю как в обычном UARTе... Надо надо, но в языках я не силён... Ruslan1, учту, хватит н анём ножек, там их 6. 4 подключу к конвертеру, и ещё один к ИК датчику TSOP1738. Хочу сделать устройство для управления ПК при помощи обычных ТВ пультов.