реклама на сайте
подробности

 
 
> Помогите переписать код для GCC под IAR
smk
сообщение Feb 1 2012, 16:39
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Суть такова: помещаем массив во flash и потом побайтно читаем.
В GCC:

Код
unsigned char brightness[256] PROGMEM = //табличка визуально равномерно наращивающая яркость
{0,0,0,1,1,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,8,9,9,10,10,10,11,11,12,12,
12,12,13,13,13,13,13,14,14,14,14,15,15,15,16,16,16,16,17,17,17,18,18,
18,19,19,19,19,20,20,20,21,21,21,22,22,22,22,23,23,23,24,24,24,25,25,
25,25,26,26,26,27,27,27,28,28,28,28,29,29,30,30,31,31,32,32,33,34,34,
35,35,36,37,38,38,39,40,41,41,42,43,44,44,45,46,47,48,48,49,50,51,52,
52,53,54,55,56,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,74,
75,76,77,78,79,80,82,83,84,86,87,88,89,91,92,94,95,97,99,101,102,104,
106,107,109,111,113,114,116,118,120,122,123,125,127,129,131,134,136,
138,140,142,145,147,149,151,153,156,158,160,162,164,167,169,171,173,
175,177,179,182,184,186,188,190,192,193,195,197,198,200,202,203,205,
206,208,210,211,213,215,217,218,220,222,223,225,226,228,229,231,232,
233,235,236,237,239,240,241,242,243,244,245,246,247,249,250,251,252,
253,254,255};

if((pwm>pgm_read_byte(&brightness[count_pwm]))|(pwm==0)){sig_off;}


А как такое делается в IAR? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smk
сообщение Feb 1 2012, 17:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Сделал #pragma location="PROGMEM". Теперь вот такую ошибку пишет.

Код
Error[Pe095]: array is too large D:\DATA\IAR_AVR\DatMSL\DatMSL_main.c 16
Error[Be010]: segment/section name not allowed (object must have static storage duration and be const or __no_init) D:\DATA\IAR_AVR\DatMSL\DatMSL_main.c 16


Цитата(_Артём_ @ Feb 1 2012, 19:09) *
Так например:
Код
__flash unsigned char brightness[256]={.....}
if (brightness[count_pwm]....) {...}

Пробовал. выдает ошибку.

В нелпе как-то через указатель делается. Кто-то так делал?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
shmur
сообщение Feb 1 2012, 17:34
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553



Цитата(smk @ Feb 1 2012, 20:15) *
Сделал #pragma location="PROGMEM". Теперь вот такую ошибку пишет.

Код
Error[Pe095]: array is too large D:\DATA\IAR_AVR\DatMSL\DatMSL_main.c 16
Error[Be010]: segment/section name not allowed (object must have static storage duration and be const or __no_init) D:\DATA\IAR_AVR\DatMSL\DatMSL_main.c 16


Нужно с const
Код
#pragma location="PROGMEM"
[b]const[/b] unsigned char brightness[256] = {...}

PROGMEM должен быть определен в конфиг файле линкера, примерно так:
place in ROM_region { readonly section PROGMEM };

Если что курите иаровский DevelopmentGuide, там обо всем этом неплохо написано.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 1 2012, 18:06
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Кстати, а что за проц?
Я про АВР писал, у других архитектур может быть иначе.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 1 2012, 18:23
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(_Артём_ @ Feb 1 2012, 20:06) *
Кстати, а что за проц?
Я про АВР писал, у других архитектур может быть иначе.

Tiny13a

Сделал вот так
Код
__flash const unsigned char brightness[256] =


Пишет ошибку
Код
Error[e16]: Segment CODE (size: 0x30e align: 0x1) is too long for segment definition. At least 0x26 more bytes needed. The problem occurred while processing the segment placement command  
"-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END", where at the moment of placement the available memory ranges were "CODE:118-3ff"
   Reserved ranges relevant to this placement:
   CODE:14-113          NEAR_F
   CODE:114-117         INITTAB
   CODE:118-3ff         CODE


И еще это почему-то не нравится

Код
unsigned int read_adc (void)
{
unsigned int adc_res=0;
ADCSRA |= (1<<6);
while (!(ADCSRA & (1<<4)));
adc_res = ((ADCH<<8)+ADCL);
return adc_res;
}


Код
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement D:\DATA\IAR_AVR\DatMSL\DatMSL_main.c 54





--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 1 2012, 18:31
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(smk @ Feb 1 2012, 20:23) *
Tiny13a

Сделал вот так
Код
__flash const unsigned char brightness[256] =


Пишет ошибку
Код
Error[e16]: Segment CODE (size: 0x30e align: 0x1) is too long for segment definition. At least 0x26 more bytes needed. The problem occurred while processing the segment placement command  
"-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END", where at the moment of placement the available memory ranges were "CODE:118-3ff"
   Reserved ranges relevant to this placement:
   CODE:14-113          NEAR_F
   CODE:114-117         INITTAB
   CODE:118-3ff         CODE


Цитата
At least 0x26 more bytes needed.

Что-то памяти ему мало. Попробуйте уменьшить массив на 0x26 байт или упростите программу (только чтобы посмотреть откомпилируется ли и куда положит)

Цитата(smk @ Feb 1 2012, 20:23) *
Код
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement D:\DATA\IAR_AVR\DatMSL\DatMSL_main.c 54

Ему не нравится такое выражение:
Цитата
adc_res = ((ADCH<<8)+ADCL);

Можно так:
Код
adc_res = ADC;





Go to the top of the page
 
+Quote Post
smk
сообщение Feb 1 2012, 18:45
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(_Артём_ @ Feb 1 2012, 20:31) *
Что-то памяти ему мало. Попробуйте уменьшить массив на 0x26 байт или упростите программу (только чтобы посмотреть откомпилируется ли и куда положит)


Ему не нравится такое выражение:

Можно так:
Код
adc_res = ADC;

Попробовал, получилось. Спасибо.

По части памяти я очень удивлен. GCC откомпилировал в 936 байт, а на ИАР как раз перетягиваю т.к. нужно кое-чего добавить, а у ИАР говорят код компактней. Может привести код целиком?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- smk   Помогите переписать код для GCC под IAR   Feb 1 2012, 16:39
- - shmur   Объявить как const и IAR сам поместит в ro секцию....   Feb 1 2012, 16:54
|- - _Артём_   Цитата(shmur @ Feb 1 2012, 18:54) Объявит...   Feb 1 2012, 17:18
|- - smk   Цитата(_Артём_ @ Feb 1 2012, 19:18) Нет н...   Feb 1 2012, 17:21
- - _Артём_   Цитата(smk @ Feb 1 2012, 18:39) Суть тако...   Feb 1 2012, 17:09
|- - _Артём_   Цитата(smk @ Feb 1 2012, 19:15) Сделал #p...   Feb 1 2012, 17:30
|- - _Артём_   Цитата(smk @ Feb 1 2012, 20:45) Попробова...   Feb 1 2012, 18:53
- - SSerge   способов куча, смотря что нужно. 1. через #pragma...   Feb 1 2012, 18:07
- - smk   Оптимизация максимальная по размеру. Код#include ...   Feb 1 2012, 19:22
|- - Сергей Борщ   QUOTE (smk @ Feb 1 2012, 21:22) Оптимизац...   Feb 1 2012, 20:17
|- - _Артём_   Цитата(smk @ Feb 1 2012, 21:22) Оптимизац...   Feb 1 2012, 21:31
- - smk   Уменьшил CSTACK до 0x0f и тоже собралось. Получило...   Feb 2 2012, 08:30
|- - Сергей Борщ   QUOTE (smk @ Feb 2 2012, 09:42) ИАР выдае...   Feb 2 2012, 08:37
- - smk   Сделал везде по 1 варианту. Это пока дало наилучши...   Feb 2 2012, 09:52
|- - Сергей Борщ   QUOTE (smk @ Feb 2 2012, 11:52) Сделал ве...   Feb 2 2012, 10:45
- - smk   По последним данным GCC 936 байт, а IAR 770 байт, ...   Feb 2 2012, 17:47
- - smk   Самый лучший результат составил 750 байт. В железе...   Feb 4 2012, 10:52


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 08:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016