Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Ср сен 12, 2018 14:53:04

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

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

Задача записывать во флеш настройки скопом из всех массивов и считывать в массивы при включении мк.
Откройте для себя memcpy.

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

Ср сен 12, 2018 22:58:19

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

Не знаю как там в кейл, но в IAR есть чудесный префикс __packed. И если объявить long-переменную с этим префиксом, то даже на МК не поддерживающих невыровненный доступ, обращения к таким невыровненным переменным будет происходить как по-маслу - без HF. И "дополнительный расход памяти" чудесным образом уйдёт в небытие. :)
Думаю что и в кейл должно быть что-то подобное.

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

Чт сен 13, 2018 08:20:09

http://www.keil.com/support/man/docs/ar ... 968737.htm

и
http://www.keil.com/support/man/docs/ar ... 966304.htm

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

Чт сен 13, 2018 08:33:35

И если объявить long-переменную с этим префиксом, то даже на МК не поддерживающих невыровненный доступ, обращения к таким невыровненным переменным будет происходить как по-маслу - без HF.
ТС злобный буратино, он невыровненный доступ с помощью приведения типа указателя получает. Против лома никакой __packed не спасёт. Если он захотел 32-битный доступ, то он его получит.

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

Чт сен 13, 2018 08:41:07

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

Добавлено after 3 minutes 6 seconds:
Alex писал(а):Или просто в union их объединить.

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

Чт сен 13, 2018 08:48:51

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

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

Чт сен 13, 2018 08:59:37

Зачем изобретать велосипед и не пользоваться memcpy()? https://devel.rtems.org/browser/umon/ma ... a9b6214cd6
Причем это верно для любой платформы. Функция memcpy() почти всегда имеет оптимизацию под конкретную архитектуру. Уж больно часто необходимо копировать массивы данных.

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

Чт сен 13, 2018 09:17:31

объявляю массив таким образом:
__align(4) uint8_t adr_sensor[QTY_TERM_SENSOR][8];
и все норм.

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

Чт сен 13, 2018 12:15:29

ТС, откройте для себя структуры и, как уже выше сказали, memcpy. И любые параметры пихайте в эту структуру.
Потом просто сохраняйте/читайте её, и никаких проблем не будет.

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

Чт сен 13, 2018 12:47:02

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

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

Чт сен 13, 2018 13:09:25

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

Нет, но ссылку на исходник memcpy, обеспечивающий оптимальную скорость копирования я привел выше. Берите его за основу. Если, конечно, не жалко flash.
Я в таких случаях предпочитаю пользоваться EEPROM или AT24C*

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

Чт сен 13, 2018 14:35:39

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

Почему её должно быть жалко? Запись происходит максимум несколько десятков раз за всю жизнь девайса. Объем флеша МК вполне позволяет.

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

Чт сен 13, 2018 18:15:01

На простое копирование из 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 плюс еще пару команд.

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

Чт сен 13, 2018 23:32:01

Копирование маленьких объёмов данных с помощью memcpy, естественно, будет нерациональным по скорости. И это нужно понимать.
Вы бы ещё с одним байтом сравнили :))
Ну а реверс нужен не всем. ТС'у, для сохранения/чтения данных он явно ни к чему.

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

Пт сен 14, 2018 13:44:53

Не думаю что конфигурационные данные могут занимать большие объемы. Если увеличится объем то так же линейно увеличится и время, или memcpy больший объем будет копировать быстрее? сомневаюсь!

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

Ср ноя 21, 2018 11:53:46

Увеличил тактовую частоту с помощью 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;

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

Ср ноя 21, 2018 12:06:12

Код:
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1;

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

Ср ноя 21, 2018 12:36:11

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

Добавлено after 10 minutes 16 seconds:
Полжение дел одинаковое на stm32f030 и stm32f071

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

Ср ноя 21, 2018 12:53:27

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

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

Запись во флеш тактируется от HSI, который ты отключил.

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

Ср ноя 21, 2018 13:01:27

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