|
IAR настройки линкера, Как сделать чтобы линкер не вставлял библиотечные модули |
|
|
|
Aug 15 2010, 17:14
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Добрый Вечер. Спасибо за помощь в аналогичной теме... http://electronix.ru/forum/index.php?showtopic=79333(Думаю если тему поменять может что то изменится...) С ИАРом знаком давно, но глубоко не разбирался. В ИАР АРМ версия 4.42 (в которой работаю) проблем особых не возникало. В частности когда ставишь галочку Defined by application в настройках линкера свои модули типа __low_level_init или __low_level_call_init компилятор не вставляет. В дисассемблере только код моего стартапа и скомпилированный код сишных файлов. Создал пример в компиляторе IAR MCS-51 7.51A (в IAR MCS-51 7.60.1 в принципе таже лажа). Хотелось бы чтобы он не вставлял свои "__low_level_init" и прочее (в симуляторе в код модулей компилятор не переходит...)... В настройках линкера поставил глалочку Defined by application. Написал свой стартап сделал простенькую функцию в main. настройки general Device nRF24LE1 CPU core Plain Code model Near Data model Small асемблерный стартап Код #include "ionRF24LE1.h" //------------------------------------------------------------------------------ PROGRAM start //------------------------------------------------------------------------------ RSEG CODE
EXTERN main PUBLIC reset reset: ljmp init //------Инициализация----------------------------------------------------------- init: MOV PSW,#0x00 MOV SP,#0xBF lcall main exit: ljmp exit //------------------------------------------------------------------------------ END и собственно функция Код unsigned char d;
unsigned char summa(unsigned char a, unsigned char b, unsigned char c) { return a+b+c; }
void main() { d = summa(10,20,30); } Без переменых только код ничего лишнего... обьявляю переменные в конце кода компилятор вставляет "__low_level_init" и прочее, которые никогда не используются!... Отключал библиотеку CLIB в настройках без переменных проект собирается и с локальными переменными собирается, обьявляешь внешнюю переменную начинает ругаться: Error[e46]: Undefined external "__INIT_IDATA_Z" referred in main ( D:\IAR projects\8051\test_asm\Debug\Obj\main.r51 ) Еще вечная ругня компилятора по поводу что ему не хватает стека при компиляции и в симуляторе. Если есть возможность укажите что надо сделать, что почитать))) ломаю голову целую неделю...
|
|
|
|
|
Aug 15 2010, 17:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE Если есть возможность укажите что надо сделать, что почитать))) Стандарт языка - глобальные переменные должны быть инициализированы. Хочется приключений? Объявляйте их неициализированными. Только ведбь им по любому придется какие-то значения присваивать, а это по любому код. QUOTE (shrek @ Aug 15 2010, 19:14)  (Думаю если тему поменять может что то изменится...) Admin: Устное замечание за нарушение правил п.3.2
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 15 2010, 17:43
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата Admin: Устное замечание за нарушение правил п.3.2 Виноват... Цитата Объявляйте их неициализированными. Только ведбь им по любому придется какие-то значения присваивать, а это по любому код. Обьявлял... тоже самое... С IAR ARM такого не было по разному обьявлял. Только мой код и ничего лишнего! Но с IAR MCS-51 я "подружиться" не могу))) Цитата Хочется приключений?  приключения начались с момента когда главному конструктору стало необходимо освоение контроллера nRF24LE1. Выяснилось что он еще к тому же приобрел глюченые чипы (может быть полезной инфа у этих чипов с маркировкой "NRF AX" или "NRF A" (уже не помню) SPI в режиме slave не работает. В еррате не было этого. По заверению производителя "NRF B" рабочий)...
Сообщение отредактировал shrek - Aug 15 2010, 18:14
|
|
|
|
|
Aug 16 2010, 09:03
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Только что попробывал разные варианты обьявления переменных. Внутри функций, внешние, глобальные. Все равно вставляет компилятор кусок кода Код //------------------------------------------------- MOV PSW,#0x00 init: 0000AE 75 D0 00 MOV PSW,#0x00 MOV SP,#0xBF 0000B1 75 81 BF MOV SP,#0xBF CLR A 0000B4 E4 CLR A lcall main 0000B5 12 00 E4 LCALL main ljmp exit exit: 0000B8 02 00 B8 LJMP exit __low_level_init_call: 0000BB 12 00 D2 LCALL __low_level_init 0000BE B9 00 03 CJNE R1,#0x00,0x00C3 0000C1 02 00 D2 LJMP __low_level_init __INIT_IDATA_Z: 0000C4 E4 CLR A 0000C5 79 08 MOV R1,#0x08 0000C7 78 01 MOV R0,#0x01 0000C9 B8 00 02 CJNE R0,#0x00,0x00CD 0000CC 80 04 SJMP __low_level_init 0000CE F7 MOV @R1,A 0000CF 09 INC R1 0000D0 D8 FC DJNZ R0,0x00CE __low_level_init: 0000D2 79 01 MOV R1,#0x01 0000D4 22 RET a: 0000D5 10 20 30 JBC 0x24.0,0x0107 void ifp_int(){} ifp_int: //------------------------------------------------- в который PC никогда не заходит... свой стартап Код #include "ionRF24LE1.h" //------------------------------------------------------------------------------ PROGRAM start EXTERN init_perif EXTERN rf_init EXTERN main EXTERN ifp_int EXTERN tf0_int EXTERN pof_int EXTERN tf1_int EXTERN uart_int EXTERN tf2_int EXTERN rfrdy_int EXTERN rfirq_int EXTERN spi_int EXTERN wuopirq_int EXTERN miscirq_int EXTERN tick_int //------------------------------------------------------------------------------ RSEG CSTART
reset: ljmp init //------Вектор прерывания IFP 0x0003-------------------------------------------- org 0x0003 push PSW push A mov A,#00h sjmp start_int //------Вектор прерывания TF0 0x000B-------------------------------------------- org 0x000B push PSW push A mov A,#03h sjmp start_int //------Вектор прерывания POF 0x0013-------------------------------------------- org 0x0013 push PSW push A mov A,#06h sjmp start_int //------Вектор прерывания TF1 0x001B-------------------------------------------- org 0x001B push PSW push A mov A,#09h sjmp start_int //------Вектор прерывания UART 0x0023------------------------------------------- org 0x0023 push PSW push A mov A,#0Ch sjmp start_int //------Вектор прерывания TF2 0x002B-------------------------------------------- org 0x002B push PSW push A mov A,#0Fh sjmp start_int //------Вектор прерывания RFRDY 0x0043------------------------------------------ org 0x0043 push PSW push A mov A,#12h sjmp start_int //------Вектор прерывания RFIRQ 0x004B------------------------------------------ org 0x004B push PSW push A mov A,#15h sjmp start_int //------Вектор прерывания SPI 0x0053-------------------------------------------- org 0x0053 push PSW push A mov A,#18h sjmp start_int //------Вектор прерывания WUOPIRQ 0x005B---------------------------------------- org 0x005B push PSW push A mov A,#1Bh sjmp start_int //------Вектор прерывания MISCIRQ 0x0063---------------------------------------- org 0x0063 push PSW push A mov A,#1Eh sjmp start_int //------Вектор прерывания TICK 0x006B------------------------------------------- org 0x006B push PSW push A mov A,#21h sjmp start_int //------Обработка прерываний---------------------------------------------------- go_sub: jmp @A+DPTR start_int: push DPH push DPL mov PSW,Rx_Bank3 mov DPTR,#0x008A lcall go_sub pop DPL pop DPH pop A pop PSW reti //------Адреса функций прерываний----------------------------------------------- org 0x008A ljmp ifp_int ljmp tf0_int ljmp pof_int ljmp tf1_int ljmp uart_int ljmp tf2_int ljmp rfrdy_int ljmp rfirq_int ljmp spi_int ljmp wuopirq_int ljmp miscirq_int ljmp tick_int //------Инициализация----------------------------------------------------------- init: MOV PSW,#0x00 MOV SP,#0xBF CLR A //lcall init_perif //lcall rf_init lcall main exit: ljmp exit //------------------------------------------------------------------------------ END громоздкий к сожалению... main.c Код char d; const char a = 0x10; const char b = 0x20; const char c = 0x30;
void main() { d = a + b + c; } ну и прерывания irq.c Код #include "ionRF24LE1.h"
//------------------------------------------------------------------------------ void ifp_int(){} //------------------------------------------------------------------------------ void tf0_int(){} //------------------------------------------------------------------------------ void pof_int(){} //------------------------------------------------------------------------------ void tf1_int(){} //------------------------------------------------------------------------------ void uart_int(){} //------------------------------------------------------------------------------ void tf2_int(){} //------------------------------------------------------------------------------ void rfrdy_int(){} //------------------------------------------------------------------------------ void rfirq_int(){} //------------------------------------------------------------------------------ void spi_int(){} //------------------------------------------------------------------------------ void wuopirq_int(){} //------------------------------------------------------------------------------ void miscirq_int(){} //------------------------------------------------------------------------------ void tick_int(){} //------------------------------------------------------------------------------ Вставляет свое аккурат между стартупом и irq.c... (мозг потихоньку припухает...)
Сообщение отредактировал shrek - Aug 16 2010, 09:09
|
|
|
|
|
Aug 25 2010, 10:09
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037

|
Цитата(shrek @ Aug 16 2010, 13:03)  Только что попробывал разные варианты обьявления переменных. Внутри функций, внешние, глобальные. Все равно вставляет компилятор кусок кода....
Вставляет свое аккурат между стартупом и irq.c... (мозг потихоньку припухает...) Счастлииивые, уже мозг припухает, а я вот ещё не знаю чем писать прогу, чем в nRF24LE1 заталкивать. Не поделитесь информацией?
|
|
|
|
|
Aug 27 2010, 03:34
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
"Главный" купил кит я через него и заталкиваю) А так в даташите есть все команды для программирования по SPI можно попробовать написать самому программатор на чем либо и через ком порт или usb грузить в nRF  Кит nRF6310. Я через ISP интерфейс на борту кита программирую все мои nRF24LE1. В том числе перепрошил модули RFD21737 и RFD21739.  правда получилось перепрошить только два) с остальными связываться кит не хочет).
|
|
|
|
|
Aug 28 2010, 04:53
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037

|
Спасибо за поддержку, мне сейчас всё интересно на эту тему. Посмотрел киты, какие в продаже, чего то дороговато показалось. Вот такой вариант ещё есть - приобрести полноценный программатор ChipProg-ISP. http://www.phyton.ru/pages/page72.htmlНу и конечно начать со среды по теме: IAR EW8051-751A, скачал но пока не разбирался, вроде с кряком. Ещё есть предложение тему начать nRF24LE1 рядом с ARM,AVR,MSP430.
|
|
|
|
|
Aug 28 2010, 06:08
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037

|
Цитата(shrek @ Aug 15 2010, 21:43)  (может быть полезной инфа у этих чипов с маркировкой "NRF AX" или "NRF A" (уже не помню) SPI в режиме slave не работает. В еррате не было этого. По заверению производителя "NRF B" рабочий)... Это заявление настораживает, мне что пришлют из Дельта Электроники?
|
|
|
|
|
Aug 29 2010, 06:23
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата Это заявление настораживает, мне что пришлют из Дельта Электроники? ну если slave spi использоваться не будет) остальное все работает) Цитата Ещё есть предложение тему начать nRF24LE1 рядом с ARM,AVR,MSP430. ну вроде есть уже подфорум по контроллерам на базе 8051) смысла нет там все тоже, но про nRF там очень мало...
|
|
|
|
|
Sep 1 2010, 04:02
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Вчера заметил один глюк... (IAR MCS-51 V7.51) Собрал проект, скомпилил, попробовал в симуляторе все вроде нормально. (галка стояла на оптимизации Low) Прошиваю чип... не работает... Должен раз в секунду мигать светодиодом по команде запуска, проверял генераторы, так как встроенный часовой RC генератор давал ощутимую погрешность, а имеется необходимость достаточно точно время отсчитывать. А иначе получится несогласование работы передатчиков. Поставил галку на None... Скомпилил, попробовал в симуляторе все вроде норм. Прошиваю чип не работает. Поставил галку на Medium... Скомпилил, попробовал в симуляторе все вроде норм. Прошиваю чип работает. Поставил галку на High (Balanced)... Скомпилил, попробовал в симуляторе все вроде норм. Прошиваю чип работает. Код #include "ionRF24LE1.h" #include "rf_transceiver.h"
void delay(unsigned int j) {while (--j > 0);}
const unsigned char address[5] = {0xC3, 0xC3, 0xC3, 0xC3, 0xC3}; unsigned char buffer[5];
void main() { unsigned char i; //------------------------------------------------------------------------------ DIS_RF; //---CONFIG--------------------------------------------------------------------- rf_power_down(); rf_crc_mode(CRC_8BIT); //CRC 8 бит rf_dis_irq(ALL_IRQ); //Выключаем все прерывания rf_en_irq(RX_DR); //Включаем прерывание по приему rf_prx_mode(); //устанавливаем приоритетный режим передачи данных //---EN_AA---------------------------------------------------------------------- rf_dis_aa(ALL_PIPE); //выключаем Enhanced ShockBurst для всех каналов //---EN_RXADDR------------------------------------------------------------------ rf_dis_rxaddr(ALL_PIPE); //выключаем адреса для всех каналов rf_en_rxaddr(PIPE_0); //включаем адрес для канала 0 //---SETUP_AW------------------------------------------------------------------- rf_setup_aw(AW_5BYTES); //устанавливаем ширину адреса в 5 байт //---SETUP_RETR----------------------------------------------------------------- rf_write_reg(SETUP_RETR, 0x00); //устанавливаем счетчик авторетрансляции в 0 //---RF_CH---------------------------------------------------------------------- rf_set_channel(0x3); //устанавливаем частотный канал 3 //---RF_SETUP------------------------------------------------------------------- rf_set_rate(RATE_250KBPS); //устанавливаем битрейт 250 кбит/с //------------------------------------------------------------------------------ i = 5; while (i--) buffer[i] = address[i]; rf_write_multibyte_reg(RX_ADDR_P0, buffer, 5); //устанавливаем адрес канала 0 для приема //---RX_PW_P0------------------------------------------------------------------- rf_write_reg(RX_PW_P0, 4); //устанавливаем фиксированное число байт приема канала 0 //---DYNPD---------------------------------------------------------------------- rf_dis_dynpd(ALL_PIPE); //выключаем динамическую длинну данных для всех каналов //---FEATURE-------------------------------------------------------------------- rf_write_reg(FEATURE, 0x00); //выключаем все прочие функции //---CONFIG--------------------------------------------------------------------- rf_power_up(); //переводим в режим stantby-I delay (200); //RTC2CON = Comp_res | RTC2_en; IEN1 = RF_int | Tick_int; //прерывание от RF T2CON = 0; IEN0 = En_all_int; EN_RF; //------------------------------------------------------------------------------ while(1); } Опытным путем установил что чип останавливается или уходит в ребут или в бесконечном цикле на Код i = 5; while (i--) buffer[i] = address[i]; или Код rf_write_multibyte_reg(RX_ADDR_P0, buffer, 5);
Сообщение отредактировал shrek - Sep 1 2010, 04:09
|
|
|
|
|
Sep 1 2010, 04:57
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(shrek @ Sep 1 2010, 08:02)  Опытным путем установил что чип останавливается или уходит в ребут или в бесконечном цикле на Код i = 5; while (i--) buffer[i] = address[i]; или Код rf_write_multibyte_reg(RX_ADDR_P0, buffer, 5); Надо смотреть листинг рабочей прошивки и нерабочей в этом месте. Искать 10 отличий. Долго думать.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 2 2010, 09:27
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 21-08-10
Из: Набережные Челны
Пользователь №: 59 037

|
Установил IAR EW8051-751A, файл "ionRF24LE1.h" найти не могу. А что ещё надо установить для nRF24LE1?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|