Jump to content

    

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

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

Т.е. вот так:

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

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

Share this post


Link to post
Share on other sites
34 minutes ago, artemkad said:

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

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

Share this post


Link to post
Share on other sites
47 минут назад, artemkad сказал:

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

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

Share this post


Link to post
Share on other sites
On 1/27/2019 at 1:58 AM, jcxz said:

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

 

 

 

Share this post


Link to post
Share on other sites
6 часов назад, haker_fox сказал:

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

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

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

Share this post


Link to post
Share on other sites
В 26.01.2019 в 20:10, artemkad сказал:

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

В gcc можно так:

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

 

Share this post


Link to post
Share on other sites
7 hours ago, jcxz said:

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

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

6 hours ago, adnega said:

В gcc можно так:

И снова

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

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

 

Share this post


Link to post
Share on other sites
6 часов назад, haker_fox сказал:

И снова

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

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

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

Share this post


Link to post
Share on other sites
7 часов назад, haker_fox сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
18 hours ago, jcxz said:

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

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

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

 

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

Share this post


Link to post
Share on other sites
2 hours ago, artemkad said:

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

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

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

Share this post


Link to post
Share on other sites
2 часа назад, artemkad сказал:

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now