|
Ламерские вопросы по Си, перехожу с асма |
|
|
|
Oct 4 2012, 08:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
А как тогда объявить указатель на массив во флэш? з.ы. Ради интереса удалил PROGMEM, ничего не поменялось. Пишет: ../font.h:1660:3: warning: initialization discards qualifiers from pointer target type Добавлено:Удалил "static const" перед uint8_t font_0x31[6] PROGMEM и варнинг пропал, но по прежнему выдает какую-то ошибку и она почему-то не отображается в билдере... Добавлено еще раз:Фув, наконец-то скомпилировалось. Вчера полдня и сегодня до обеда сходил с ума
Сообщение отредактировал Alt.F4 - Oct 4 2012, 08:43
|
|
|
|
|
Oct 4 2012, 08:37
|

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

|
Цитата(Alt.F4 @ Oct 4 2012, 11:51)  MrYuran, компилятор пишет: ../font.h:1362:3: warning: initialization from incompatible pointer type Так это ж не ругается, так, под нос бухтит  Может, так попробовать: static const* uint8_t font_0x31 PROGMEM = {0x00,0x81,0xff,0x80,0x00,0x00};
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Oct 4 2012, 08:41
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Alt.F4 @ Oct 4 2012, 11:28)  з.ы. Ради интереса удалил PROGMEM, ничего не поменялось. Пишет: ../font.h:1660:3: warning: initialization discards qualifiers from pointer target type Напишите так Код uint8_t font_0x31[6] = {0x00,0x81,0xff,0x80,0x00,0x00}; uint8_t font_0x32[6] = {0x82,0xc1,0xa1,0x91,0x8e,0x00}; uint8_t font_0x33[6] = {0x42,0x81,0x89,0x89,0x76,0x00};
const FontStruct FontTable[] = { {0x31, font_0x31,6}, {0x32, font_0x32,6}, {0x33, font_0x33,6}}; - без static const и без &.
|
|
|
|
|
Oct 4 2012, 12:02
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Код typedef struct { uint8_t code; const uint8_t* index; // указатель на КОНСТАНТНЫЙ массив (не хватало квалификатора const) uint8_t width; } FontStruct;
const FontStruct FontTable[] = { {0x31, &font_0x31[0], 6}, // И тут тоже косяк был. Надо либо брать адрес нулевого элемента массива, либо просто имя массива без взятия адреса. {0x32, &font_0x32[0], 6}, {0x33, &font_0x33[0], 6} }; А в остальном у вас всё изначально правильно и static const к месту и PROGMEM. Правда FontTable тоже во флешь можно разместить...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 5 2012, 05:47
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(_Артём_ @ Oct 4 2012, 23:39)  Не совсем так. В avr-gcc const uint8_t* ptr при простом разыменовывании указателя всегда обращается к ОЗУ, а чтобы читать из флеша или eeprom нужно через макросы мыкаться: pgm_read_byte(ptr) и eeprom_read_byte(ptr). Что как раз не так удобно как в IAR. Но и в avr-gcc 4.7.0 тоже появилась аналогичная IARу фича: ключевое слово __flash и теперь стало возможно Код const __flash uint8_t x1 = 33; const __flash uint8_t x2 = 36; const __flash uint8_t* ptr = &x1; if (*ptr==x2) { ... } Цитата(Alt.F4 @ Oct 4 2012, 22:29)  пока надоело бодаться с этим компилятором, придирается ко всяким мелочам. Это никакие не мелочи. Просто нужно один раз разобраться в теме и получать удовольствие от работы... Для тренировки ответьте себе на следующий вопрос, чем отличаются следующие указатели: Код char* p1; const char* p2; char* const p3; const char* const p4;
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 5 2012, 09:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата а чтобы читать из флеша или eeprom нужно через макросы мыкаться: pgm_read_byte(ptr) и eeprom_read_byte(ptr). Миллионным перебором вариантов стал объявлять адрес для ЕЕ как void* adrr;  А для чтения свой макрос написал (не знал, что есть eeprom_read_byte()): Код #define EE_read {\ cli();\ EEAR = (u16)addr++;\ sbi(EECR,EERE);\ temp = EEDR;\ EEAR = 0;\ sei();} Цитата Для тренировки ответьте себе на следующий вопрос, чем отличаются следующие указатели: Вроде бы так: char* p1; - переменный указатель на массив типа char const char* p2; - указатель константа на массив типа char (хотя он все равно будет размещен в ОЗУ как и первый) char* const p3; - тоже самое const char* const p4; - тоже самое
Сообщение отредактировал Alt.F4 - Oct 5 2012, 09:47
|
|
|
|
|
Oct 5 2012, 10:39
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Alt.F4 @ Oct 5 2012, 13:47)  Вроде бы так: Нет не так. Отсюда и все проблемы.. char* p1; - указатель на char const char* p2; - указатель на const char char* const p3; - константный указатель на char const char* const p4; - константный указатель на const char Пока вы азы языка Си не поймёте, так и будете ходить по граблям, занимаясь подбором-перебором и изобретая очередные грабли. Остановитесь, почитайте азы - сразу увидите как всё станет понятно и красиво. Цитата(Alt.F4 @ Oct 5 2012, 13:47)  А для чтения свой макрос написал (не знал, что есть eeprom_read_byte()) Зря... Достаточно #include <avr/eeprom.h> и в путь. В avrlibc очень оптимально написано, что касается eeprom, да многое другое тоже.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 5 2012, 14:13
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(demiurg_spb @ Oct 5 2012, 08:47)  Не совсем так. В avr-gcc const uint8_t* ptr при простом разыменовывании указателя всегда обращается к ОЗУ, а чтобы читать из флеша или eeprom нужно через макросы мыкаться: pgm_read_byte(ptr) и eeprom_read_byte(ptr). Сделал так: Код const uint8_t PROGMEM test[3]={1, 2, 4}; const uint8_t test2[3]={11,12,16}; const uint8_t * ptr; volatile uint8_t test_copy[9]; __attribute__ ((section (".eeprom"))) const uint8_t test3[3]={'A','B','m'}; int main() { ptr=test; test_copy[0]=ptr[0]; test_copy[1]=ptr[1]; test_copy[2]=ptr[2];
ptr=test2; test_copy[3]=ptr[0]; test_copy[4]=ptr[1]; test_copy[5]=ptr[2];
ptr=test3; test_copy[6]=ptr[0]; test_copy[7]=ptr[1]; test_copy[8]=ptr[2]; Но похоже GCC просто соптимизировал чтение. Если массивы объявить не как const, работать не будет.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|