указатели в keil

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: указатели в keil

Сообщение VladislavS »

Всего лишь хотел передать суть проблемы.
Суть вам описали в первом же ответе.

В М3 действительно все было норм, а М0 такая вот ерунда.
Ну да, M3 умеет невыровненный доступ.

Задача записывать во флеш настройки скопом из всех массивов и считывать в массивы при включении мк.
Откройте для себя memcpy.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: указатели в keil

Сообщение jcxz »

Проблема исчезла при объявлении 32-разрядных массивов. Правда, появился дополнительный расход памяти.

Не знаю как там в кейл, но в IAR есть чудесный префикс __packed. И если объявить long-переменную с этим префиксом, то даже на МК не поддерживающих невыровненный доступ, обращения к таким невыровненным переменным будет происходить как по-маслу - без HF. И "дополнительный расход памяти" чудесным образом уйдёт в небытие. :)
Думаю что и в кейл должно быть что-то подобное.
Аватара пользователя
ozzy
Грызет канифоль
Сообщения: 256
Зарегистрирован: Вс янв 18, 2009 20:15:27
Откуда: UA ZT

Re: указатели в keil

Сообщение ozzy »

Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: указатели в keil

Сообщение VladislavS »

И если объявить long-переменную с этим префиксом, то даже на МК не поддерживающих невыровненный доступ, обращения к таким невыровненным переменным будет происходить как по-маслу - без HF.
ТС злобный буратино, он невыровненный доступ с помощью приведения типа указателя получает. Против лома никакой __packed не спасёт. Если он захотел 32-битный доступ, то он его получит.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: указатели в keil

Сообщение Z_h_e »

Лучше объявить массив с 32х битными элементами, он то точно будет пословно выравнен, а побайтный доступ к нему работать будет.

Добавлено after 3 minutes 6 seconds:
Alex писал(а):Или просто в union их объединить.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: указатели в keil

Сообщение VladislavS »

Лучше объявить массив с 32х битными элементами
Вот нахрена эти извращения? ТС написал, что это копирование происходит ОДИН РАЗ ПРИ СТАРТЕ ПРОГРАММЫ для считывания конфигурации. На чём экономить собрались? Микросекунда при старте погоду сделает?
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: указатели в keil

Сообщение ПростоНуб »

Зачем изобретать велосипед и не пользоваться memcpy()? https://devel.rtems.org/browser/umon/ma ... a9b6214cd6
Причем это верно для любой платформы. Функция memcpy() почти всегда имеет оптимизацию под конкретную архитектуру. Уж больно часто необходимо копировать массивы данных.
Ser-B
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вт ноя 02, 2010 20:21:53

Re: указатели в keil

Сообщение Ser-B »

объявляю массив таким образом:
__align(4) uint8_t adr_sensor[QTY_TERM_SENSOR][8];
и все норм.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: указатели в keil

Сообщение Аlex »

ТС, откройте для себя структуры и, как уже выше сказали, memcpy. И любые параметры пихайте в эту структуру.
Потом просто сохраняйте/читайте её, и никаких проблем не будет.
Ser-B
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вт ноя 02, 2010 20:21:53

Re: указатели в keil

Сообщение Ser-B »

В memcpy реализована процедура записи во flash?
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: указатели в keil

Сообщение ПростоНуб »

В memcpy реализована процедура записи во flash?

Нет, но ссылку на исходник memcpy, обеспечивающий оптимальную скорость копирования я привел выше. Берите его за основу. Если, конечно, не жалко flash.
Я в таких случаях предпочитаю пользоваться EEPROM или AT24C*
Ser-B
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вт ноя 02, 2010 20:21:53

Re: указатели в keil

Сообщение Ser-B »

Если, конечно, не жалко flash.

Почему её должно быть жалко? Запись происходит максимум несколько десятков раз за всю жизнь девайса. Объем флеша МК вполне позволяет.
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: указатели в keil

Сообщение optima »

На простое копирование из 8 битного массива 4 байтов в 32 битную переменную id_data, с реверсом данных в необходимый вид. Таким образом
id_data = moimassiv[1]<<8;
id_data = ( id_data + moimassiv[2])<<8;
id_data = ( id_data + moimassiv[3])<<8;
id_data = id_data + moimassiv[4];
Уходит 14 asm команд, если то же самое делаю применяя memcpy то уже 47 команд! Потом еще нужно сделать реверс __REV плюс еще пару команд.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: указатели в keil

Сообщение Аlex »

Копирование маленьких объёмов данных с помощью memcpy, естественно, будет нерациональным по скорости. И это нужно понимать.
Вы бы ещё с одним байтом сравнили :))
Ну а реверс нужен не всем. ТС'у, для сохранения/чтения данных он явно ни к чему.
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: указатели в keil

Сообщение optima »

Не думаю что конфигурационные данные могут занимать большие объемы. Если увеличится объем то так же линейно увеличится и время, или memcpy больший объем будет копировать быстрее? сомневаюсь!
Ser-B
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вт ноя 02, 2010 20:21:53

Re: указатели в keil

Сообщение Ser-B »

Увеличил тактовую частоту с помощью PLL с 8МГц до 24МГЦ.

RCC->CR |= ((uint32_t)RCC_CR_HSEON);
while((RCC->CR & RCC_CR_HSERDY) == 0) { }

RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PLLMUL)) | RCC_CFGR_PLLMUL3 | RCC_CFGR_PLLSRC_HSE_PREDIV; // (6)

RCC->CR |= RCC_CR_PLLON; // (7)
while((RCC->CR & RCC_CR_PLLRDY) == 0) // (8)
{

}

RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_PLL); // (9)
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) //(10)
{

}
RCC->CR &= ~((uint32_t)RCC_CR_HSION);
while((RCC->CR & RCC_CR_HSIRDY) == 0) { }

Стал виснуть MK при записи во flash на
*(__IO uint16_t*)(Address) = (uint16_t)data;
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: указатели в keil

Сообщение VladislavS »

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

FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1;
Ser-B
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вт ноя 02, 2010 20:21:53

Re: указатели в keil

Сообщение Ser-B »

Не помогает.
Да и FLASH_ACR_LATENCY ставится если SYSCLK > 24MHz

Добавлено after 10 minutes 16 seconds:
Полжение дел одинаковое на stm32f030 и stm32f071
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: указатели в keil

Сообщение Reflector »

RCC->CR &= ~((uint32_t)RCC_CR_HSION);
while((RCC->CR & RCC_CR_HSIRDY) == 0) { }

Стал виснуть MK при записи во flash на
*(__IO uint16_t*)(Address) = (uint16_t)data;

Запись во флеш тактируется от HSI, который ты отключил.
Ser-B
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вт ноя 02, 2010 20:21:53

Re: указатели в keil

Сообщение Ser-B »

Благодарю. Заработало.
Ответить

Вернуться в «ARM»