Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.08.2007, 01:52
|
|
Частый гость
Регистрация: 13.07.2007
Сообщений: 35
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
PIC18F.., HI-TECH PICC-18 и MPLAB
Помогите плиз, кто чем может!!!
Пишу программу для PIC18F452 в MPLAB 7.11 на С, компилятор HI-TECH PICC-18 v9.50.
Столкнулся с такой проблемой: при достижении общего объема проги примерно 60% (в том числе константы и сам код) компилятор в окне Output пишет:
Advisory[1207] : some of the command line options you are using are now obsolete
Advisory[1208] : use --help option or refer to the user manual for option details
Error[593] : can't find 0x401E words (0x401e withtotal) for psect "text" in segment "CODE"
BUILD FAILED: Fri Aug 17 00:30:52 2007
Т.е. не хватает памяти контроллера!!! НО!!!
При просмотре кода после компиляции, сам код (main и остальные подпрограммы) находится с адреса 0х4000 до 0х7FFF, а до 0х4000 примерно 8кБ памяти свободных (без учета констант)!!!
Константы компилятор вставляет в начале памяти.
Вопрос:
Почему компилятор не вставляет код раньше 0х4000 и если есть возможность, как это задать? (напр. в ассемблере есть директива code..., есть ли такая директива в С ?)
Буду очень благодарен!!!
|
|
|
|
17.08.2007, 07:44
|
|
Прописка
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
ИМХО суть в том что ф-ция не может быть больше какого то определенного объема (на микрочип.ру обсуждали это). Надо бить программу на отдельные функции, причем не подпрограммы вызываемые из main, а объявленные в MPLAB в разделе source file (см.скриншот). Таким способом я забил в чип программу, занимающую 99.5% памяти pic18...а раньше больше 55% ни в какую не лезла
-- Прилагается рисунок: --
|
|
|
|
17.08.2007, 08:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Фантастика ! Я бы другой компилер попробовал.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
17.08.2007, 12:16
|
|
Частый гость
Регистрация: 13.07.2007
Сообщений: 35
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от stri
|
Надо бить программу на отдельные функции, причем не подпрограммы вызываемые из main, а объявленные в MPLAB в разделе source file (см.скриншот).
|
Если можно, поподробнее как это сделать. (как правильно объявить эти функции в main ???).
Я попробовал добавить в Source Files самый большой файл system.с, после этого компилятор перестал видеть глобальные переменные, вызываемые в system.с, эти переменные объявлены в отдельных файлах vars.h, config.h.
-- Прилагается рисунок: --
-- Прилагается рисунок: --
|
|
|
|
17.08.2007, 12:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
На пальцах не объяснить. Переменные должны быть объявлены как extern , чтобы виделись с другого файла. Обявляешь в заголовочном файле, а его подключаешь через include . Присоедини проект.
|
|
|
|
17.08.2007, 15:02
|
|
Прописка
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Допустим есть файл main.c, в нем есть всякие разные функции, переменные и тп. Но все они занимают одно адресное пространство. Допустим место в нем кончилось. Добавляю новый с файл, пишу как обычно Include pic18.h пишу там функцию (к примеру void INIT()), в файле с main где include пишу: extern void INIT(); . И теперь могу из любого места main ее вызывать. Но т.к. у той функции свое пространство переменных, то если даже я в обоих функциях сделаю какую нить переменную типа char P, то функция main будет видеть свое значение этой переменной, а INIT свое, т.к. по сути это две разных переменных с одним именем. Чтобы они работали с одной переменной, их надо тоже объявить как extern char p;
|
|
|
|
17.08.2007, 15:05
|
|
Прописка
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
в твоем случае, если просто в *.h файле сделать переменные доступные обеим функциям extern должно быть достаточно...
|
|
|
|
18.08.2007, 00:01
|
|
Частый гость
Регистрация: 13.07.2007
Сообщений: 35
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от stri
|
Допустим есть файл main.c, в нем есть всякие разные функции, переменные и тп. Но все они занимают одно адресное пространство. Допустим место в нем кончилось. Добавляю новый с файл, пишу как обычно Include pic18.h пишу там функцию (к примеру void INIT()), в файле с main где include пишу: extern void INIT(); . И теперь могу из любого места main ее вызывать. Но т.к. у той функции свое пространство переменных, то если даже я в обоих функциях сделаю какую нить переменную типа char P, то функция main будет видеть свое значение этой переменной, а INIT свое, т.к. по сути это две разных переменных с одним именем. Чтобы они работали с одной переменной, их надо тоже объявить как extern char p;
|
Сделал все как было указано, но, похоже, этого не достаточно.
Создал тестовый проект - вот результат, переменную "knopka" компил. все равно не видит (рис.)
Ниже прилагаю этот проект. Если не сложно, посмотрите что не так и отпишите пожалуйста.
А может еще какие нить настройки компилятора менять надо?
А может мне компилятор действительно поменять надо?
stri, каким компил. пользуешся?
-- Прилагается рисунок: --
Прикрепленный файл: 2151346.rar
|
|
|
|
18.08.2007, 01:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
объяви как локальную. В любом сишном, она все равно будет глобальной. 18 компилер у меня на работе, дома только под 16 пики. У меня откомпилилось.
Прикрепленный файл: 796945.rar
|
|
|
|
19.08.2007, 12:39
|
|
Вид на жительство
Регистрация: 06.10.2006
Сообщений: 329
Сказал спасибо: 4
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
››А может мне компилятор действительно поменять надо?
››stri, каким компил. пользуешся?[/quote]
Я чуть поправил
Как ни удивительно, 8.35 как правило дает самый маленький код.
Прикрепленный файл: 5479760.rar
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Си, IAR AVR & Hi Tech PICC
|
picavr |
Микроконтроллеры, АЦП, память и т.д |
47 |
25.02.2014 12:20 |
HI-TECH PICC™ Enterprise Edition (new!!!)???
|
shihaidong |
Микроконтроллеры, АЦП, память и т.д |
14 |
30.12.2011 15:45 |
Библиотеки LCD 44780 на С CCS или HI-TECH PICC для PIC16
|
vsvetlov |
Микроконтроллеры, АЦП, память и т.д |
15 |
27.10.2009 08:03 |
MPLAB и Hi-Tech
|
3ann |
Микроконтроллеры, АЦП, память и т.д |
0 |
14.07.2009 15:17 |
Подскажите плиз. Чё то у меня MPLAB с HI-TECH не соединяется
|
Komanda |
Микроконтроллеры, АЦП, память и т.д |
4 |
02.12.2005 20:21 |
Часовой пояс GMT +4, время: 14:54.
|
|