|
void const *argument, Что это? |
|
|
|
 |
Ответов
|
Jan 9 2014, 07:28
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Tarbal @ Jan 9 2014, 04:47)  В процессорах с Гарвардской архитектурой AVR, PIC, 8051 константы размещаются во флеше. Ну вот где вы такое видели применительно к языку C в реальном мире? Квалификатор const лишь дает гарантию, что компилятор не допустит изменения переменной с таким квалификатором. И никоим образом не влияет на адресное пространство. Если вы объявили переменную с квалификатором const - под нее точно так же будет выделено место в ОЗУ. вот вам простой пример: Код char string1[] = " string1"; char const string2[] = "string2";
void print_string(char const * string) // const тут гарантирует, что функция не изменит переданную ей строку { .........
string[0] = '+'; // компилятор даст по рукам. В объявлении параметра мы обещали, что не будем его менять }
void empty_string(char * string) // а вот тут гарантий нет, переданная строка может быть изменена. { ......... string[1] = '+'; // пожалуйста }
void test() { print_string(string1); // да без проблем, в соответствии с правилами языка print_string(string2); // тоже запросто
empty_string(string1); // легко empty_string(string2); // нифига. const в объявлении string2 запрещает, функция может модифицировать строку
string1[0] = "!"; // да, пожалуйста string2[0] = "x"; // а вот фиг } А теперь объясните, каким образом print_string() будет понимать - ей передали указатель на строку во флеше или на строку в ОЗУ? Именно поэтому каждый компилятор добавляет расширения - вводит дополнительные квалификаторы для указания адресного пространства. Цитата(Tarbal @ Jan 9 2014, 04:47)  Передавая такой параметр в функцию надо дать знать в каком пространстве памяти находится параметр, чтобы функция использовала правильные ассемблерные команды. Для этого и используется слово const. Pic использует слово flash кажется, но это в микрочиповском компиляторе. Нет. слово const используется для другого. Как раз слово flash явлается расширением языка - квалификатором адресного пространства и используется именно для этого. А вот в процессорах с единым адресным пространством (ARM, x86, MSP430) досуп к переменным во флеше или в ОЗУ на чтение одинаков, поэтому именно в них возможно указать линкеру размещать константные переменные во флеше не загружая копию в ОЗУ. А можно указать хранить в ОЗУ и все будет как у больших машин.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 9 2014, 08:16
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Сергей Борщ @ Jan 9 2014, 10:28)  А вот в процессорах с единым адресным пространством (ARM, x86, MSP430) досуп к переменным во флеше или в ОЗУ на чтение одинаков, поэтому именно в них возможно указать линкеру размещать константные переменные во флеше не загружая копию в ОЗУ. А можно указать хранить в ОЗУ и все будет как у больших машин. Есть способ - указать квалификатор static. Код static const uint8_t *SourTxt[] = {"Кан1", "Кан2"}; В ОЗУ этих строк не будет. Сразу будут читаться из флэш программы.
|
|
|
|
Сообщений в этой теме
ViKo void const *argument Jan 6 2014, 19:06 megajohn ну к примеру у вас на контроллере два UART
и в од... Jan 6 2014, 19:57 ViKo Цитата(megajohn @ Jan 6 2014, 22:57) то е... Jan 6 2014, 20:35 kosyak© Вот зачем оно конст...? Jan 6 2014, 20:14 megajohn если оно будет на стеке, то по моменту запуска сам... Jan 6 2014, 20:18 kosyak© тогда уж
task_start( mb_task, ..., (void const*)... Jan 6 2014, 20:40 GetSmart Вообще-то компилятор должен "съедать" эт... Jan 6 2014, 23:38 ViKo Цитата(GetSmart @ Jan 7 2014, 02:38) Кака... Jan 7 2014, 08:50  GetSmart Цитата(ViKo @ Jan 7 2014, 14:50) Возможно... Jan 7 2014, 10:08   ViKo Цитата(GetSmart @ Jan 7 2014, 13:08) Чем ... Jan 7 2014, 10:18    GetSmart Цитата(ViKo @ Jan 7 2014, 16:18) Led9_id ... Jan 7 2014, 10:38     ViKo Цитата(GetSmart @ Jan 7 2014, 13:29) Пред... Jan 7 2014, 10:42    GetSmart Цитата(ViKo @ Jan 7 2014, 16:18) Тем, что... Jan 8 2014, 06:38     ViKo Цитата(GetSmart @ Jan 8 2014, 09:38) А (v... Jan 8 2014, 09:21      Сергей Борщ Цитата(ViKo @ Jan 8 2014, 11:21) Мое мнен... Jan 8 2014, 10:51      GetSmart Цитата(ViKo @ Jan 8 2014, 15:21) Проверьт... Jan 8 2014, 10:56       ViKo Цитата(GetSmart @ Jan 8 2014, 13:56) Кейл... Jan 8 2014, 11:10        Сергей Борщ Цитата(ViKo @ Jan 8 2014, 13:10) На uin... Jan 8 2014, 18:11         ViKo Цитата(Сергей Борщ @ Jan 8 2014, 21:11) Е... Jan 8 2014, 18:30          Сергей Борщ Цитата(ViKo @ Jan 8 2014, 20:30) Почему ж... Jan 9 2014, 01:29  GetSmart Цитата(ViKo @ Jan 7 2014, 14:50) В C можн... Jan 10 2014, 11:45   ViKo Цитата(GetSmart @ Jan 10 2014, 14:45) Ну ... Jan 10 2014, 11:59    GetSmart Цитата(ViKo @ Jan 10 2014, 17:59) Как это... Jan 10 2014, 12:07     ViKo Цитата(GetSmart @ Jan 10 2014, 15:07) Ещё... Jan 10 2014, 14:13 megajohn Цитата(GetSmart @ Jan 7 2014, 03:38) Квал... Jan 7 2014, 10:20  Herz Цитата(Сергей Борщ @ Jan 9 2014, 09:28) А... Jan 9 2014, 08:11   Сергей Борщ Цитата(Herz @ Jan 9 2014, 10:11) А каким ... Jan 9 2014, 12:19    ViKo Цитата(Сергей Борщ @ Jan 9 2014, 15:19) Я... Jan 9 2014, 12:24     Сергей Борщ Цитата(ViKo @ Jan 9 2014, 14:24) Да, с ло... Jan 9 2014, 12:44  Tarbal Цитата(Сергей Борщ @ Jan 9 2014, 10:28) Н... Jan 9 2014, 18:55 GetSmart Цитата(Tarbal @ Jan 9 2014, 08:47) В проц... Jan 10 2014, 19:22 andrewlekar При чём тут static вообще? На ARMах const в опреде... Jan 9 2014, 10:17 XVR Использование ключевых слов static и/или const для... Jan 9 2014, 10:20 ViKo Цитата(XVR @ Jan 9 2014, 13:20) Поэтом, п... Jan 9 2014, 10:36 andrewlekar Цитатадля каких именно компиляторов
Ни для каких. ... Jan 9 2014, 10:27 andrewlekar Что, вашему компилятору не хватает ума разместить ... Jan 9 2014, 10:40 andrewlekar Что вы этим гениальным кодом хотите проверить? В c... Jan 10 2014, 05:29 Tarbal Цитата(andrewlekar @ Jan 10 2014, 08:29) ... Jan 10 2014, 14:22 редактор Цитатато надо было указать квалификатор __flash.
О... Jan 10 2014, 08:04 andrew_b Цитата(редактор @ Jan 10 2014, 12:04) con... Jan 10 2014, 08:54 ViKo Удостоверился в Кейл для глобальных переменных:
- ... Jan 10 2014, 09:45 Сергей Борщ Цитата(ViKo @ Jan 10 2014, 11:45) Удостов... Jan 10 2014, 11:05 andrewlekar ЦитатаУ кого есть IAR AVR?
ЦитатаДля процессора с ... Jan 10 2014, 17:30 Tarbal Цитата(andrewlekar @ Jan 10 2014, 21:30) ... Jan 10 2014, 22:35 andrewlekar ЦитатаНичего не понял. Может попробуете еще раз вы... Jan 11 2014, 06:32 Tarbal Цитата(andrewlekar @ Jan 11 2014, 10:32) ... Jan 11 2014, 18:22  Сергей Борщ Цитата(Tarbal @ Jan 11 2014, 20:22) Я вам... Jan 11 2014, 19:33   Tarbal Цитата(Сергей Борщ @ Jan 11 2014, 22:33) ... Jan 13 2014, 12:28 Tarbal Вот документ.
На странице 5 есть информация о разм... Jan 14 2014, 13:10 demiurg_spb Цитата(Tarbal @ Jan 14 2014, 17:10) Вот д... Jan 14 2014, 15:42  Tarbal Цитата(demiurg_spb @ Jan 14 2014, 19:42) ... Jan 14 2014, 16:09   demiurg_spb Цитата(Tarbal @ Jan 14 2014, 20:09) Прост... Jan 14 2014, 16:34    Tarbal Цитата(demiurg_spb @ Jan 14 2014, 20:34) ... Jan 14 2014, 18:46     Сергей Борщ Цитата(Tarbal @ Jan 14 2014, 20:46) О ста... Jan 15 2014, 07:37 Сергей Борщ Цитата(Tarbal @ Jan 14 2014, 15:10) Вот д... Jan 14 2014, 18:09 andrewlekar Ну вот я собрал ваш код при помощи IAR AVR 5.3. Во... Jan 15 2014, 04:53 Tarbal Цитата(andrewlekar @ Jan 15 2014, 08:53) ... Jan 15 2014, 13:13  Сергей Борщ Цитата(Tarbal @ Jan 15 2014, 15:13) И как... Jan 15 2014, 15:23 dxp Очень плотно использовал IAR для AVR в конце девян... Jan 15 2014, 13:49 Tarbal Цитата(dxp @ Jan 15 2014, 17:49) Очень пл... Jan 16 2014, 23:40
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|