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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

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

b = eeprom_read_byte(&array[5]);
Ставим плюсы: )
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

в данном случае адрес массива брать не надо. имя массива - итак указатель на первый элемент.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

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

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


int EEMEM b=123;

int main(void)
{

   int b;

   b = eeprom_read_byte(&b);

}
а как туже процедуру сделать, только для массива не понятно
весь массив сразу или часть его можно считать функцией eeprom_read_block.
«И всё-таки она вертится!»
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Pink-Pank писал(а):в данном случае адрес массива брать не надо.
это мне? если да, то я и не брал адрес массива, я взял адрес элемента массива)
записи:

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

b = eeprom_read_byte(&array[5]);
b = eeprom_read_byte(array+5);
идентичны
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

Apparatchik писал(а):его можно считать функцией eeprom_read_block.
объясните как она работает?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

это мне?..я взял адрес элемента..
Точняк.. Сам запутался. ))
Fucking static initialization order fiasco
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

kelod писал(а): объясните как она работает?
eeprom_read_block()

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

void eeprom_read_block (void *dst, const void *src, size_t n)
Параметры:
void *dst – указатель на начало области в ОЗУ
const void *src – указатель на начало области EEPROM
size_t n – количество байт
Возвращаемое значение: нет.
Описание: функция выполняет считывание n байтов из EEPROM по адресу src и размещает их в ОЗУ, начиная с адреса dest.
«И всё-таки она вертится!»
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

а так что бы программист на си чуствовал тебя программистом на си??
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Это как?

Если непонятно описание то скажу "попроще":
первый параметр - массив куда читать, ноходящийся в ОЗУ.
второй параметр - массив откуда читать, находящийся в еепром.
третий параметр - сколько байт читать.
Последний раз редактировалось Apparatchik Пт июл 04, 2014 13:13:54, всего редактировалось 1 раз.
«И всё-таки она вертится!»
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

пример использования можно?
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

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

char mas[13];
EEMEM char mas_eeprom[13] = {...};

eeprom_read_block(mas, mas_eeprom, 13);
«И всё-таки она вертится!»
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

не работает у меня :cry:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

У меня работает. Покажите полный код.
«И всё-таки она вертится!»
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

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

for (int8_t i=otr_spis;i<otr_spis_1;i++)
						{							
							unsigned char buffer1[40];	
							uint32_t t[13];
							eeprom_read_block(t,t_og_r,sizeof(t));
							utoa(t[i], buffer1, 10);
							LcdStr(FONT_1X,buffer1);
						}
а eeprom_read_word(&t_og_r) работает, хотя в тоже время eeprom_read_dword(&t_og_r) не работает(((
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

сделал с dword, но всё равно хочется понять как работает блок
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

насколько мне ведомо то в Си такого типа как bool нет
но в некоторых прогах я его видал
в чем фокус то ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

в С++ есть, в версии стандарта С99 добавили булевый тип, называется _Bool
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Тип в C по сути ненужный. Тем же char-ом можно заменить.

А что в прогах видел - возможно, там было что-то вроде #define bool char
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

WiseLord писал(а):А что в прогах видел - возможно, там было что-то вроде #define bool char
твердо утверждать не стану, на там вроде такого нет
под прогами я имел ввиду скрипты написанные на Си для WinCC
Tell Me The Truth
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Имеется массив указателей на функции:

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

const void(*mnu_func_ptr[11])() ={ // menu functions pointer
&menu_main, &menu_time, &menu_date, ... };
С помощью него организован автомат состояний программы т.к. на switch-case получается длинная и медленная обработка.
Вызов нужной функции происходит через косвенный переход:

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

(mnu_func_ptr[device_sm-DEV_STA_MNU_MAIN])(); // indirect call
Проблема: Т.к. указатель - это по сути переменная, то массив хранится в RAM. С другой стороны функции лежат во flash, их адреса постоянны и определяются линкером на этапе компиляции.
Таким образом было бы логичнее их адреса записать в константный массив примерно так:

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

__flash uint16_t func_adress[]={ &menu_main, &menu_date, ... } 
Но так компилятор ругается.

Как корректно объявлять и инициализировать массив адресов функций во flash чтобы не тратить драгоценную RAM ?
Компилятор CVAVR 2.05 и CVAVR 1.25.
Спасибо.
Ответить

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