Перейти к содержанию
    

Как заставить инициализировать по-умолчанию не нулем?

Возник тут вопросик... Если инициализировать массив к примеру во Флеше МК, то все что явно не указано iar  заполнит нулями. 

Т.е. вот так:

 __flash uint8_t hello_world_buf[1000] = "hello world"; 
 

все кроме первых 11 байт будет забито нулями. А как-бы заставить компилятор забить чем-то другим(например 0xFF)? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 minutes ago, artemkad said:

А как-бы заставить компилятор забить чем-то другим(например 0xFF)?

В случае частичной инициализации массива/структуры - никак, по стандарту должны быть нули.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

47 минут назад, artemkad сказал:

все кроме первых 11 байт будет забито нулями. А как-бы заставить компилятор забить чем-то другим(например 0xFF)? 

Переопределить секцию на какую-нить свою, в icf-файле указать её как неинициализируемую, а потом в стартап-файле - заполнить чем надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/27/2019 at 1:58 AM, jcxz said:

а потом в стартап-файле - заполнить чем надо

Не получится. Там же флешь.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если заранее известно, что надо это [1000]

Определите сегмент, например, MY_THOUSAND_SEG из 1000 байт.

В этом сегменте разместите Ваш массив uint8_t @MY_THOUSAND_SEG  hello_world_buf[] = "hello world"; 

Если не пользоваться для массива sizeof, зная, что он реально 1000, то можно индексировать по всему сегменту исходя из его (сегмента) размера.

Для сегмента можно извратиться и сделать аналог sizeof

Совершенно "не через то место", но все-же.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, haker_fox сказал:

Не получится. Там же флешь.

Если флешь, то тогда вообще нет никакого смысла объявлять такой массив в 1000 байт, а использовать из него только 11.

Зачем так делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 26.01.2019 в 20:10, artemkad сказал:

А как-бы заставить компилятор забить чем-то другим(например 0xFF)? 

В gcc можно так:

volatile BYTE            video_cfg[DIGIT_NUM + 1] = {[0 ... (DIGIT_NUM-1)] = '3'};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, jcxz said:

Зачем так делать?

Ну это вопрос для ТС.

6 hours ago, adnega said:

В gcc можно так:

И снова

On 1/27/2019 at 1:10 AM, artemkad said:

Если инициализировать массив к примеру во Флеше МК

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, haker_fox сказал:

И снова

Дык, без разницы. У ТС было бы так (будь у него gcc):

 __flash uint8_t hello_world_buf[1000] = {[0 ... (1000 - 1)] = 0xFF}; 

Или я не понимаю в чем проблема...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, haker_fox сказал:

Ну это вопрос для ТС.

ТС свою задачу не озвучил. А озвучил какое странное и кривое её решение которое смог придумать. Вообще нет необходимости так делать. Для чего угодно.

Можно 100500 раз обсуждать способы доставки лодки на Луну, только воды там нет, и средства передвижения там другие. Тогда какой смысл это обсуждать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

. . . Можно 100500 раз обсуждать способы доставки лодки на Луну, только воды там нет, и средства передвижения там другие. Тогда какой смысл это обсуждать?

Ну ..... это как "прижало в сортир по-крупному".  Думал не-надо и не-надо, а как приспичило - так любое решение подойдет. :biggrin:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одна "0xFF," это 5 символов. В одной строке (80 символов) помещается таких 16 штук. Итого, чтобы инициализировать 1000 элементов массива надо всего 63 строки кода. Легко делается копипастами :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, jcxz said:

Если флешь, то тогда вообще нет никакого смысла объявлять такой массив в 1000 байт, а использовать из него только 11.

Зачем так делать?

Автономный программатор. "1000" байт потом зальются в другой МК. Если страница содержит одни 0xFF  её можно игнорировать, а вот нули писать надо обязательно. Естественно, потом уже в процессе работы содержимое 1000 байт может меняться своим загрузчиком.

 

В общем, единственное пока вменяемое решение это прилинкование внешнего бинарника...  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, artemkad said:

а вот нули писать надо обязательно.

А чем это плохо? Скоростью записи? Износом флеша?

Может быть у задачи есть и другое решение? Например, указать сколько байт записывать и куда (в какие страницы, с какого адреса)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, artemkad сказал:

В общем, единственное пока вменяемое решение это прилинкование внешнего бинарника...  

Вовсе не единственное:

- можно в скрипте линкера явно проинициализировать секцию 0xFF;

- но, по указанной вами логике, правильнее объявить секцию как NOLOAD.

Шить, разумеется, можно не одним файлом, а секторами.

У меня так обычно эмуляция eeprom делается - есть секция под хранение данных eeprom, она никак не инициализируется,

а только дописывается и при необходимости посекторно стирается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...