Вопросы по С/С++ (СИ)
Наверное, потому что при комментировании кода его размер уменьшался - это становился уже другой код - оптимизатор мог его сделать ещё более различным - функции располагались уже по другим адресам, и выводиться могло уже что-то другое.
- Реклама
балаган начинается с "фигурных скобочек", где не надо, а заканчивается тем, чтоshads писал(а):В общем извиняюсь за очередной балаган, который я тут развел.....
после чего начинаются чудеса.shads писал(а):указатель он и в африке указатель... не важно, с PROGMEM он записан, или без...
поэтому я поднапрягаюсь и советую вам тщательно изучить Си, чтобы делать не тяп-ляп, а по правилам и с полным пониманием того, что делаешь. собственно, 90% моих советов только в этом и заключаются
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Спасибо!!!ARV писал(а):cоветую вам тщательно изучить Си, чтобы делать не тяп-ляп, а по правилам и с полным пониманием того, что делаешь. собственно, 90% моих советов только в этом и заключаются
Именно этим сейчас и занимаюсь...
Я в принципе сразу сознался в своих грехах: http://radiokot.ru/forum/viewtopic.php? ... 3#p2169843
Но уже кой чего просветлело в голове
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
Здравствуйте, подскажите как разместить в структуре строки разного размера. Компилятор CodeVisionAvr
есть такая структура меню
Сделал пару пунктов меню по смотрел подумал что избыточно выделять на текстовую часть 40 байт
Захотел сделать такое что бы при инициализации выделялось место ровно по текстовой части т.е при таком варианте:
выделилось в озу 8-9 байт на указатели а в текстовой части нечего не было (следующая переменная )
а при таком варианте выделилось 8 байт на указатели и ещё массив со строкой "1234567"
Думал что вот такое изменение unsigned char Text[]; приведёт меня к желаемому результату но нет
после первой инициализации Null_Menu он создаёт массив нулевой размерностью и на все остальные строчки компилятор начинает ругаться "Error: ... included from: shaper.c: too many initializers"
есть такая структура меню
Код: Выделить всё
typedef struct PROGMEM{
void *Next;
void *Previous;
void *Parent;
void *Child;
unsigned char OK;
unsigned char ESC;
unsigned char ACTION_NEXT;
unsigned char ACTION_DOWN;
unsigned char Text[41];
} menuItem;Захотел сделать такое что бы при инициализации выделялось место ровно по текстовой части т.е при таком варианте:
Код: Выделить всё
menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0,0,0,0,0, ""}; Код: Выделить всё
menuItem Null_Menu2 = {(void*)0, (void*)0, (void*)0, (void*)0,0,0,0,0, "1234567"}; Думал что вот такое изменение unsigned char Text[]; приведёт меня к желаемому результату но нет
после первой инициализации Null_Menu он создаёт массив нулевой размерностью и на все остальные строчки компилятор начинает ругаться "Error: ... included from: shaper.c: too many initializers"
попробуйте использовать указатель на строку char *Text;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
делай в структуре ссылку на текстовую строку, а строки объявляй отдельно.
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
здраствуйте
что означает конструкция, где ADDRESS это допустим адрес микрухи.
например ADDRESS = 0b00000010, то получается что
0b00000010
0b00000001
__________
0b00000011 ?
что означает конструкция
Код: Выделить всё
ADDRESS | 1например ADDRESS = 0b00000010, то получается что
0b00000010
0b00000001
__________
0b00000011 ?
Будь там ADDRESS |= 1 - это бы означало установку 0-го бита ADDRESS в 1.
А так - это всего лишь незавершённое логическое выражение, в результате которого получится некий промежуточный результат - число, равное ADDRESS с точностью до последнего бита, который будет равен 1. А что дальше с этим числом делается - мы не знаем.
Ну, как если бы спросить, что означает ADDRESS + 1.
А так - это всего лишь незавершённое логическое выражение, в результате которого получится некий промежуточный результат - число, равное ADDRESS с точностью до последнего бита, который будет равен 1. А что дальше с этим числом делается - мы не знаем.
Ну, как если бы спросить, что означает ADDRESS + 1.
Доброго всем дня! Пишу тут прогу для МК с архитектурой 8051 на Си в Keil, увы, уровень владения языком невысок, но интересует такой вопрос: как ассоциировать с переменной какую-либо ячейку памяти данных? Делать ассемблерную вставку или можно как-то стандартными средствами кейловского си обойтись?
Аааа... зачем?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
для MCS51 характерно "сопоставлять" переменные с определенными адресами в ОЗУ. по-моему, в кейле для этого есть расширение в виде "оператора" at или @ - точно не знаю, но вы можете посмотреть в любом хидере на периферию конкретного МК как там определены SFR-регистры, они точно привязаны к адресам...greenled писал(а):Доброго всем дня! Пишу тут прогу для МК с архитектурой 8051 на Си в Keil, увы, уровень владения языком невысок, но интересует такой вопрос: как ассоциировать с переменной какую-либо ячейку памяти данных? Делать ассемблерную вставку или можно как-то стандартными средствами кейловского си обойтись?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Gudd-Head, нужно чтобы МК изредка принимал коэффициенты для ацп и хранил у себя во флеше
ARV, адреса SFR регистров есть, но как организовать к ним обращение? постоянно ссылаться на адрес или можно как-то организовать указатель на него?
ARV, адреса SFR регистров есть, но как организовать к ним обращение? постоянно ссылаться на адрес или можно как-то организовать указатель на него?
вы не поняли: вам надо посмотреть в хидере, как определены переменные-SFR, и аналогично определить свои переменные. тогда никаких указателей не потребуется, и кейл сумеет использовать архитектурные особенности ассемблера для работы с вашими переменными, если таковые вдруг будут.
в хидере будет что-то типа такого:
unsigned char PCON at 0xF0;
вот и вам вашу переменную надо будет определить аналогично, например, если ее адрес 0x1A:
unsigned char my_var at 0x1A;
только имейте ввиду, что адрес PCON я просто от фонаря написал - не помню я настоящий.
в конце-концов хелп у вас в кейле есть или нет?! прочтите его...
в хидере будет что-то типа такого:
unsigned char PCON at 0xF0;
вот и вам вашу переменную надо будет определить аналогично, например, если ее адрес 0x1A:
unsigned char my_var at 0x1A;
только имейте ввиду, что адрес PCON я просто от фонаря написал - не помню я настоящий.
в конце-концов хелп у вас в кейле есть или нет?! прочтите его...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
О как. Была память данных, стала память программ.greenled писал(а):как ассоциировать с переменной какую-либо ячейку памяти данных?
...
МК изредка принимал коэффициенты для ацп и хранил у себя во флеше
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ARV, ок, большущее Спасибо)
Gudd-Head, нет, речь все еще о памяти данных) В даташите она фигурирует как Flash/EE, просто примелькалось
Gudd-Head, нет, речь все еще о памяти данных) В даташите она фигурирует как Flash/EE, просто примелькалось
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
На уровне языка Си можно так
В С++ вроде есть штатный способ расположения переменной по определенному адресу
Код: Выделить всё
TYPE *b=0x????; // TYPE заменить на желаемый тип данных
#define A (*b) // обращение будет именно через А
#define B (*(TYPE*)0x????) // или так, если нет желания отъедать память лишней переменной


