|
Как сказать по IARски? |
|
|
|
Jan 7 2008, 10:10
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Адаптирую позаимствованное В произведении есть такие строки: #define strncmp_flash(sram,sflash,n) strncmp_P(sram,PSTR(sflash),n) strncmp_flash(cl,"help",4); strncmp_P в IARе не нашел, PSTR тоже. Не подскажете, кто праздновать устал, как это записать по IAR'ски? Можно это сделать без копирования флэшевой строки в ОЗУ? Спасибо.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 7 2008, 10:30
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Dog Pawlowa @ Jan 7 2008, 12:10)  strncmp_P в IARе не нашел. Не подскажете, кто праздновать устал, как это записать по IAR'ски? Можно это сделать без копирования флэшевой строки в ОЗУ? strncmp_P сравнение строк в ИАРе есть. Из хелпа: Цитата int strncmp_P(const char *s1, PGM_P s2, size_t n); Identical to strncmp except that the string s2 is in flash memory, not in data memory. This function is available in both the CLIB and the DLIB library. Эта функция как раз и сравнивает без копирования. Если не хочется применять библиотечную функцию, могу предложить свою: Код //==============================================================// // Compare n bytes strings from SRAM and FLASH // // Return: 0 - strings are identical, 1 - not equal // //==============================================================// unsigned char TextCmp(char *str1, char __flash *str2, unsigned char n) { unsigned char i, result = 0; for (i=0; i<n; i++) result |= *str1++ ^ *str2++; return result; }
Сообщение отредактировал IgorKossak - Jan 7 2008, 14:05
|
|
|
|
|
Jan 11 2008, 10:00
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
2: SSergeА у вас какая версия IAR ? Дело в том что у меня начиная с версии IAR AVR 4.30 при создании таких функций выдается ошибка. И 4.30 пришлось снести  2: Baserне такие они уж и избыточные, использует указатель на 24 бита, причем в старшем хранит только страницы памяти. Когда-то тоже задавался этой целью, и у меня получилось что данный вариант предпочтительнее и по скорости и по размеру.
|
|
|
|
|
Jun 9 2008, 05:13
|

Местный
  
Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470

|
День добрый! Назрел такой вопрос: как ИАР-у(4.20) сказать чтобы перед циклом запомнил в регистр процессора адрес регистра выходных данных и потом не грузил его снова каждый раз. (Нужно ускорить процесс). Написал так: Код register uint16_t *pcSource; register uint32_t *pOut; pcSource = (uint16_t*)( xRxDescriptors[ ulNextRxBuffer ].addr & emacADDRESS_MASK); pin_off(clk_pin); // from AT91SAM7X256.h : //#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register pOut = (uint32_t*) AT91C_PIOA_ODSR; while( ulTotalFrameLength) { *pOut = *(pcSource++); pin_on(clk_pin); ulTotalFrameLength --; pin_off(clk_pin); } Но в результате компиляции упорно получается следующее: Код // 385 pOut = (uint32_t*) AT91C_PIOA_ODSR; LDR R3,??vEMACRead_and_Go_0+0x8 ;; 0xfffff430 CMP R5,#+0 BEQ ??vEMACRead_and_Go_4 // 396 *pOut = *(pcSource++); ??vEMACRead_and_Go_5: LDR R6,??vEMACRead_and_Go_0+0xC ;; 0xfffff438 LDRH R7,[R4, #+0] STR R7,[R6, #+0] ADDS R4,R4,#+2 // 399 pin_on(clk_pin); MOVS R6,#+128 LSLS R6,R6,#+10 ;; #+131072 STR R6,[R3, #+0] // 400 ulTotalFrameLength --; SUBS R5,R5,#+1 // 401 pin_off(clk_pin); STR R6,[R2, #+0] ... Тоесть при инициализации pOut в регистр пишется совсем другой адрес, который затем используется совсем в другом месте - макросом pin_on. Это макросы из ascold.h - знатокам знаком этот хедер. Оптимизация выставлена максимальная. При других уровнях оптимизации компилятор и вовсе игнорирует переменную pOut. Как это победить?
|
|
|
|
|
Jun 9 2008, 09:20
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Скомпилировал ради интереса этот пример. Код //#pragma optimize=size ... MOVS R0,#+0 MOVS R1,#+128 LSLS R1,R1,#+10 ;; #+131072 LDR R5,??task_0 ;; _ZN3GSM5stateE LDR R2,??task_0+0x4 ;; 0xfffff430 CMP R6,#+0 B ??task_1 // 272 INT32S i,n,respLen; // 273 // 274 uint32_t *pOut = (uint32_t*) AT91C_PIOA_ODSR; // 275 uint16_t *pcSource = (uint16_t*)0; // 276 while( i) // 277 { // 278 *pOut = *(pcSource++); ??task_2: LDRH R3,[R0, #+0] STR R3,[R2, #+8] ADDS R0,R0,#+2 // 279 *AT91C_PIOA_SODR=131072; STR R1,[R2, #+0] // 280 i --; SUBS R6,R6,#+1 // 281 *AT91C_PIOA_CODR=131072; STR R1,[R2, #+4] // 282 } ??task_1: BNE ??task_2 IAR EWARM 5.11.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Jun 10 2008, 07:57
|

Местный
  
Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470

|
0_0 Красиво компилит! Только что заметил что у меня почемуто компилятор не использует смещение при записи в регистры... А вообще, как я говорил, у меня там в цикле еще есть громоздкая обработка конца буфера, которая кушает регистры. С ней возможно результат уже не будет выглядеть так хорошо. Но всеравно красиво. Неужто пятый настолько умнее? Нехотел на него переходить, потомучто читал тут что у него свои заморочки. Но похоже надо... {-----------------------------------UPDATED 10.06.08-----------------------------------------} Обнаружил что у меня в настройках установлен THUMB MODE. Без него все получается красиво в асме, но зато в железе сразу же улетает в Undefvec.....
|
|
|
|
|
Jul 15 2008, 06:24
|

Группа: Новичок
Сообщений: 9
Регистрация: 8-04-08
Пользователь №: 36 568

|
Привет всем. Не стал создавать новую тему решил написать сдесь. помогите есть функции 1) pgm_read_byte 2) loop_until_bit_is_set 3) bit_is_set взял исходник WinAVR, а в IAR таких функций нет , вот не знаю что делать. Описание функций есть, и заменять их кусом кода не хочется. Я мало знаю особенности ИАРа , может опытные подскажут аналоги этих функций ???
Сообщение отредактировал vashurin - Jul 15 2008, 06:40
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|