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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Ламерские вопросы по Си, перехожу с асма
xemul
сообщение Oct 4 2012, 08:20
Сообщение #31



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Правильно пишет.
uint8_t * index
uint8_t font_0x31[6] PROGMEM
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 4 2012, 08:28
Сообщение #32


Профессионал
*****

Группа: Свой
Сообщений: 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 и варнинг пропал, но по прежнему выдает какую-то ошибку и она почему-то не отображается в билдере...

Добавлено еще раз:
Фув, наконец-то скомпилировалось. Вчера полдня и сегодня до обеда сходил с ума cranky.gif

Сообщение отредактировал Alt.F4 - Oct 4 2012, 08:43
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 4 2012, 08:37
Сообщение #33


Беспросветный оптимист
******

Группа: Свой
Сообщений: 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

Так это ж не ругается, так, под нос бухтит sm.gif

Может, так попробовать:
static const* uint8_t font_0x31 PROGMEM = {0x00,0x81,0xff,0x80,0x00,0x00};


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 4 2012, 08:41
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 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 и без &.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 4 2012, 12:02
Сообщение #35


неотягощённый злом
******

Группа: Свой
Сообщений: 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 тоже во флешь можно разместить...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 4 2012, 18:29
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Цитата
Правда FontTable тоже во флешь можно разместить...
Да, попозже наверное так и сделаю, пока надоело бодаться с этим компилятором, придирается ко всяким мелочам.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 4 2012, 19:39
Сообщение #37


Гуру
******

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



Цитата(Alt.F4 @ Oct 4 2012, 21:29) *
Да, попозже наверное так и сделаю, пока надоело бодаться с этим компилятором, придирается ко всяким мелочам.

Я так понял, что const uint8_t * может и к flash, и к eeprom, и к озу обращаться?
Удобно, IAR так не позволяет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 5 2012, 05:47
Сообщение #38


неотягощённый злом
******

Группа: Свой
Сообщений: 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;


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 5 2012, 09:47
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Цитата
а чтобы читать из флеша или eeprom нужно через макросы мыкаться: pgm_read_byte(ptr) и eeprom_read_byte(ptr).
Миллионным перебором вариантов стал объявлять адрес для ЕЕ как void* adrr; sm.gif
А для чтения свой макрос написал (не знал, что есть 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 5 2012, 10:39
Сообщение #40


неотягощённый злом
******

Группа: Свой
Сообщений: 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, да многое другое тоже.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 5 2012, 12:05
Сообщение #41


неотягощённый злом
******

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



.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 5 2012, 14:13
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 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, работать не будет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 5 2012, 14:18
Сообщение #43


неотягощённый злом
******

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



Цитата(_Артём_ @ Oct 5 2012, 18:13) *
Да оптимизировал и не читал (constant propagation в действии).
Вы их (test1,2,3) как volatile const объявите или как extern из других единиц трансляции (не из main.c)...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:26
Рейтинг@Mail.ru


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