Jump to content

    

Инициализация констант по умолчанию

Доброе время суток!

Для примера, объявляю глобальную константу:

const uint32_t my_const;

константа, как и задумывалось, располагается в ROM, но при этом прошивается нулем, а хотелось бы 0xffffffff. Как в IAR EWARM 8.3 это настроить? 

Можно, конечно, сделать и так:

const uint32_t my_const = 0xffffffff;

но мне не нравится, да и для больших массивов это совсем плохо смотрится.

Edited by _lexa_

Share this post


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

но мне не нравится

Не нравится, зато по стандарту. Можно, конечно, сделать

__no_init const uint32_t my_const;

и молиться, чтобы место расположения константы стёрто было. А если завтра не FF понадобится? 

Share this post


Link to post
Share on other sites
17 minutes ago, VladislavS said:

__no_init const uint32_t my_const;

компилятор выдает ошибку.

17 minutes ago, VladislavS said:

и молиться, чтобы место расположения константы стёрто было. А если завтра не FF понадобится? 

Если понадобится не FF, значит буду инициализировать тем, что понадобится. Неиспользуемая область ROM стирается, почему бы не стирать не инициализируемые константы?

Edited by _lexa_

Share this post


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

почему бы не стирать не инициализируемые константы?

Потому что они не "не инициализируемые". Они по-умолчанию проинициализированы нулем в соответствии со Стандартом языка. Не нравится - жалуйтесь в лигу сексуальных реформ коммитет по стандартизации языка C.

Share this post


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

компилятор выдает ошибку.

 volatile

 

Но бляха-муха, если компилятор будет знать что в константе, то вероятно оптимизирует алгоритм с ней, а так будешь каждый раз читать её из флэшь.

 

Share this post


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

но мне не нравится, да и для больших массивов это совсем плохо смотрится.

А если захочется не ноль и не 0xffffffff, а, например, 0xaa55aa55, то как быть? Инициализируйте сами. "Нравится" и "плохо" смотрится - это весьма субъективно. Вот пример из моего кода. Смотрится красиво!

    static const unsigned long crc_table [ 256 ] = {
        0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535,
        0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD,
        0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D,
        0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
        0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,
        0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
        0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC,
        0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
        0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB,
        0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
        0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB,
        0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
        0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA,
        0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE,
        0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A,
        0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
        0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409,
        0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
        0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739,
        0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
        0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268,
        0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0,
        0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8,
        0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
        0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF,
        0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703,
        0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7,
        0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
        0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE,
        0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
        0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6,
        0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
        0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D,
        0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5,
        0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605,
        0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
        0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
    };

 

Share this post


Link to post
Share on other sites

Да-да, подтверждаю личным опытом, 0xFFFF'FFFF смотрится намного приятнее 0xffffffff. 

Share this post


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

Да-да, подтверждаю личным опытом, 0xFFFF'FFFF смотрится намного приятнее 0xffffffff.

ИМХО, а какая разница по=большому? Как правило, эти данные всё равно непроверяемые человеческим взглядом.

Share this post


Link to post
Share on other sites

Когда пишешь, тогда и проверяешь. Цифры считать легче и приятней. Культурный человек - эстэт во всём. 

Share this post


Link to post
Share on other sites
17 minutes ago, ViKo said:

Когда пишешь, тогда и проверяешь.

Табличку из 16 числе по 32 бита ещё можно и написать и проверить. Но в моём случае табличка сгенерирована скриптом.

Share this post


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

Табличку из 16 числе по 32 бита ещё можно и написать и проверить. Но в моём случае табличка сгенерирована скриптом.

Я целиком file.h файл создавал в Matlab. Полностью готовый к употреблению в форме #include "file.h" 
Но это не рутинная работа. А в обыденной программистской жизни константы пишутся по нескольку раз на дню.

Share this post


Link to post
Share on other sites
Just now, ViKo said:

Я целиком file.h файл создавал в Matlab. Полностью готовый к употреблению в форме #include "file.h" 

Я имел в виду, что когда табличка создана автоматически, чем угодно и где угодно, проверять её уже смысла особого нет. И написан там маленький регистр, или большой тоже по-барабану.

Share this post


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

Я имел в виду, что когда табличка создана автоматически, чем угодно и где угодно, проверять её уже смысла особого нет. И написан там маленький регистр, или большой тоже по-барабану.

У меня считались числа с плавающей точкой, тем не менее, порядок я задавал символом 'E' а не  'e'. 

Share this post


Link to post
Share on other sites
13 hours ago, Сергей Борщ said:

Потому что они не "не инициализируемые". Они по-умолчанию проинициализированы нулем в соответствии со Стандартом языка. Не нравится - жалуйтесь в лигу сексуальных реформ коммитет по стандартизации языка C.

А я и не собираюсь никуда жаловаться, мне понадобилась, чтобы константы по умолчанию были стерты. Я тут и пытаюсь у знающих людей узнать, есть ли в IAR такая возможность. Например для переменных есть __no_init. Это, кстати, тоже выходит за рамки стандарта.

12 hours ago, VladislavS said:

 volatile

Но бляха-муха, если компилятор будет знать что в константе, то вероятно оптимизирует алгоритм с ней, а так будешь каждый раз читать её из флэшь.

volatile размещает константу в RAM. Мне не нужно оптимизировать для нее код, мне нужно однажды сохранить туда информацию, потом при необходимости считывать

 

7 hours ago, haker_fox said:

"Нравится" и "плохо" смотрится - это весьма субъективно. Вот пример из моего кода. Смотрится красиво!

По сути получается инициализация мне не нужна, мне необходимо, чтобы константа была стерта после загрузки программы, т.е. НЕ инициализировалась. Да, не согласуется с названием темы, ну да ладно

Share this post


Link to post
Share on other sites
13 minutes ago, _lexa_ said:

чтобы константа была стерта после загрузки программы, т.е. НЕ инициализировалась.

"Стёрта" и "не инициализировалась" - это вещи ортогональные. Вы привязываетесь к типу памяти. __no_init указывает линкеру не размещать ваши данные в секции .noinit  (за инициализацию отвечает стартовый код), которые расположены в ОЗУ. Константу вы не можете "не инициализировать", т.к. она располагается в ROM, на которую код повлиять не может. А про стёртую память линкер и компилятор ничего не знают, и знать не обязаны. Я бы сделал инициализацию и забыл бы об этом. Какие-то ваши аргументы в виде "но мне не нравится, да и для больших массивов это совсем плохо смотрится" непонятные. Завтра перейдёте на МК у которого стёртая флешка имеет 0x00. И будете долго искать проблему))))

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