Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Ратмир
Друг Кота
Сообщения: 8864
Зарегистрирован: Чт янв 20, 2011 19:54:19
Откуда: Уфа

Re: Вопросы по С/С++ (СИ)

Сообщение Ратмир »

Парни вы хоть немного поясняйте, а то совсем запутаюсь, что знчит ай, у меня пока не ай
"Мы так жить будем, что наши внуки нам завидовать будут" В.С. Черномырдин
Изображение
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Вопросы по С/С++ (СИ)

Сообщение lix »

shurikss123 писал(а):TCCR0 = ((1<<CS02) | (0<<CS01) | (0<<CS00)); Скобки не забывайте. а то ай яй яй!

чем же так важны скобки в данном месте?
Ратмир писал(а):Парни вы хоть немного поясняйте, а то совсем запутаюсь, что знчит ай, у меня пока не ай

коэффициент предделителя поменьше надо, чтобы частота индикации была побольше.
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: Вопросы по С/С++ (СИ)

Сообщение shurikss123 »

lix писал(а):чем же так важны скобки в данном месте?

Не помню в какой книге но там так и сказано что может привести к ошибкам, поэтому наверное делаю так

Код: Выделить всё

   //TCNT2=0xDC;
   //OCR2A=0xF9;
   //OCR2B=50;
   //TCCR2A=((0<<COM2A0)|(0<<COM2A1)|(1<<COM2B0)|(1<<COM2B1)|(1<<WGM20)|(1<<WGM21));
   //TCCR2B=((0<<FOC2A)|(1<<FOC2B)|(0<<WGM22)|(0<<CS22)|(1<<CS21)|(0<<CS20));

   TIMSK0=((0<<OCIE0B)|(1<<OCIE0A)|(1<<TOIE0));//0x03;

   ADCSRA=((1<<ADEN)|(0<<ADPS1)|(0<<ADPS0));
   ADMUX=((0<<REFS1)|(1<<REFS0)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3));
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
apwork
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср май 11, 2011 12:24:54
Откуда: Лисичанск

Re: Вопросы по С/С++ (СИ)

Сообщение apwork »

ну уж нет. со скобками здесь явно перебор. они конечно компилятору не помешают, но их избыток плохо влияет на читаемость кода!
Обрамляющие скобки рекомендуется лишь применять в макросах типа:
#define SOME_MAKROS(x) ((x) >> 4)
потому как не известно в каком месте он будет использован.
И не стоит переусердствовать со скобками, забывая о приоритетах операций.
Lockdog
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Lockdog »

Помогите, пожалуйста.
Есть код:

Код: Выделить всё

__flash char atmel[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.......}

void DRAWIMAGE(int x0, int y0, int x1, int y1,
               char *data)
{
int i=0, j=0, k=0;
for(j=y0;j<y1;j++)
{
   for(i=x1;i>x0;i--)
   {
     if ((*(char*)data[k])==0xFF) LCD_PUT_PIXEL(i,j);
     k++;
   }   
}
}

void main(void)
{
.......
DRAWIMAGE(0, 0, atmel_w, atmel_h, &atmel[0]);
}


IAR ругается на строчку "DRAWIMAGE(0, 0, atmel_w, atmel_h, &atmel[0]);"
Error[Pe167]: argument of type "char __flash *" is incompatible with parameter of type "char *"

В чём косяк?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Lockdog писал(а):В чём косяк?
в том и косяк, что функции нужен указатель на RAM, а вы ему подсовываете на FLASH
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Lockdog
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Lockdog »

Я подозревал? :)
А как выйти из этой ситуации? В RAM'е хранить не могу, там его 1 кб, а у меня один массив как раз этот кбайт и занимает
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

void DRAWIMAGE(int x0, int y0, int x1, int y1,
__flash char *data)
{
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Lockdog
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Lockdog »

avreal писал(а):
void DRAWIMAGE(int x0, int y0, int x1, int y1,
__flash char *data)
{

Ну правильно __flash писать после char, но это всё равно не работает, хоть код и стал компилироваться, но на дисплй вообще ничего не выводится
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Ну если Вы объясните

Код: Выделить всё

    if ((*(char*)data[k])==0xFF) LCD_PUT_PIXEL(i,j);
зачем прочитанный из массива байт data[k] Вы приводите к указателю на char в ОЗУ, берёте данные из ОЗУ по полученному адресу и только потом их сравниваете с 0xFF, то будем думать дальше.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

э........ да я тут смотрю - массив во флеш одним байтом кодирует пиксель! я прав? при таком раскладе не удивительно, что у вас ОЗУ не хватает :))) судя по всему вы выводите монохромную графику - значит, сам бог велел кодировать 1 пиксель одинм битом, тогда массив для того же самого изображения становится сразу в 8 раз меньше! может, тогда он и в ОЗУ влезет?
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Ратмир писал(а):Нет гасил вот так см.вл. все работает

Может проще текст копировать вместо картинок???
В поисках истины человек развивается.
Lockdog
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Lockdog »

Сделал так:

Код: Выделить всё

int __flash atmel[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
.............................}

void DRAWIMAGE(int x0, int y0, int x1, int y1, int __flash *data)
{
int i=0, j=0, k=0;
int px;
for(j=y0;j<y1;j++)
{
   for(i=x1;i>x0;i--)
   {
     px = *data++;
     if (px==1) LCD_PUT_PIXEL(i,j);
   }   
}
}

.....................

DRAWIMAGE(0, 0, atmel_w, atmel_h, &atmel[0]);

Но теперь ругается линкер

Код: Выделить всё

Error[e16]: Segment NEAR_F (size: 0x4000 align: 0) is too long for segment definition. At least 0x54 more bytes needed. The problem occurred while  
processing the segment placement command "-Z(CODE)NEAR_F=_..X_FLASH_BASE-_..X_FLASH_NEND", where at the moment of placement the 
available memory ranges were "CODE:54-3fff"
   Reserved ranges relevant to this placement:
   CODE:54-3fff         NEAR_F


У меня просто конвертёр из bmp2hex переводит в 8 бит, потому и был такой массив, но мне в любом случае нужно хранить всё во флэш, т.к там будет много картинок
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Вопросы по С/С++ (СИ)

Сообщение lix »

не подходящий конвертер значит. нужен другой.
Lockdog
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Lockdog »

Ну конвертёр заточен под цветные дисплеи, да и суть не в нём. Мне главное саму идею вывода из флэша реализовать
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Вопросы по С/С++ (СИ)

Сообщение lix »

когда каждый бит картинки будет представлен одним битом то вывод можно сделать так

Код: Выделить всё

mask=1;
for(по y)
    for(по x)
    {
        if(*data &mask)
            putpixel(x,y);
        mask <<= 1;
        if(mask==0)
        {
            mask=1;
            data++;
         }
     }
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Re: Вопросы по С/С++ (СИ)

Сообщение asteroid7 »

Да гранаты у него не той системы...

Lockdog, c NEAR_F разобрались?
Таблица atmel[] сколько занимает flash? А в контроллере сколько? mega16 какая-нибудь?
Lockdog
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Lockdog »

asteroid7 писал(а):Lockdog, c NEAR_F разобрались?
Таблица atmel[] сколько занимает flash? А в контроллере сколько? mega16 какая-нибудь?

Я не знаю куда копать. Таблица занимает 1 Кб. В контроллере 16 - да, мега16
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Re: Вопросы по С/С++ (СИ)

Сообщение asteroid7 »

На программу не хватает около 100 байт.
Попробуйте включить оптимизатор по "size".
Alt+F7 -> C/C++Compiler -> Optimizations. Выбрать Low или, в крайнем случае, Medium.
При уровне High код может не заработать.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

asteroid7 писал(а):При уровне High код может не заработать.
это очень хороший компилятор, если на высоком уровне оптимизации код не работает :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

Вернуться в «Разные вопросы по МК»