Страница 230 из 386

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт окт 08, 2015 21:57:32
-Valerius-
To Pnjom-Penb
Схемы как таковой и нет (пока что..), есть желание отработать только отдельные блоки программы, чтобы в дальнейшем уже из них собрать всю программу.
Вывод каждого разряда номеронабирателя представлен в виде 1-2-4-8 , итого четыре разряда = 16 "пинов" контроллера. И еще шесть дешифраторов (тоже в коде 1-2-4-8) = 24 "пин" AVR, получается что уже на этой стадии у меня задействовано 40 выводов контроллера. А еще нужно 2..3 кнопки, 3..4 вывода- "технологические". Поэтому- задействовал ATMega32 (у меня макет на ней), для обработки разрядов номеронабирателя- использовал два мультиплексора CD4051, выходы с контроллера на дешифраторы по ТЗ (техзаданию)- только с контроллера, 74HC595 использовать- нельзя. (Можно, но не нужно :) ) Поэтому, остановился на 32 меге, для всех "хотелок" - выводов хватает, единственное с входными сигналами непонятки были.
PS С каждого разряда номеронабирателя выходит пять выводов- питание и собственно код 1-2-4-8. Конечно, можно было бы напрямую соединить номеронабиратели с дешифраторами, но тогда кто вычислениями займется, как не AVR?
Изображение

To arkhnchul
если "первый бит" это нулевой разряд (2^0), то да.
Все верно 2^0, не верно выразил свою мысль :)

Всем спасибо за помощь, буду пробовать! :beer:

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт окт 08, 2015 22:20:37
arkhnchul
MOHCTEP писал(а):Можно и арифметикой пособирать для понимания :)

Код: Выделить всё

uint8_t res = a*8+b*4+c*2+ d ; //0b00001001 == 0x09
арифметическое умножение в общем может дать лучший результат - если выполняется за меньшее количество тактов, чем последовательность сдвигов. Тут я ну совсем не знаток, но по беглому просмотру справочника для avr умножение - такт на запись множителя в регистр, два такта на умножение, такт на чтение результата; сдвиг - один такт для сдвига на одну позицию. Т.е. вроде как (???) вариант с умножением должен получаться предпочтительнее начиная со сдвига на 6 позиций.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт окт 08, 2015 22:59:27
MOHCTEP
arkhnchul :) Так я ж отметил, что предложенный Вами код с битовыми сдвигами, предпочтительней. Просто -Valerius- чуть подзапутался в логике, вот я и предложил "альтернативу", исключительно для понимания сути и без претензии на ее использование. К моему стыду, я не владею информацией о тактовой продолжительности операций, однако статистика(личная) потребления ресурсов указывает на лучший кпд логики сравнительно с арифметикой посложнее "а+в".

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт окт 09, 2015 09:13:25
Pnjom-Penb
-Valerius- писал(а):Вывод каждого разряда номеронабирателя представлен в виде 1-2-4-8 ...
Так я и думал. Не нужны Вам никакие сдвиги и лог.сложение по ИЛИ - заводите четыре выхода каждого разряда (через мультиплексор или к.л. иначе) на порт м/к и читаете этот порт - все дела. Если будут использованы четыре младших пина, то, например, так:

Код: Выделить всё

    value = PORTx & 0x0F;
Принцип такой:Изображение

Add-n
Как-то неясно Вы про использование вв/выв меги32 написали...
1. 40 вводов/выводов у нее нету - четыре порта по 8 = 32 вывода
2. Если "номеронабиратели" видны меге32 через 4051, то почему Вы пишете "итого четыре разряда = 16 "пинов" контроллера"? Там получается 8+3+1+1 = 13.
3. Про дешифраторы ничего не сказано, но возможно, требование "выходы на дешифраторы по ТЗ только с контроллера" также допускает мультиплексирование. Например, если у них есть вывод CS, или вывод Common, как у "номеронабирателей" на фото.
4. Логика вычислений не изложена ("Конечно, можно было бы напрямую соединить номеронабиратели с дешифраторами, но тогда кто вычислениями займется, как не AVR?"), однако, не исключено, что эта логика м.б. реализована без контроллера - смотря какая логика.

В общем, все, что связано с чтением номеронабирателей можно уложить в 6 или 7 выводов - в один порт, да еще и останется 1-2 вв/выв под кнопки. Если дешифраторы таковы, как я предположил выше, то их можно обрабатывать вторым портом. При отсутствии дешифратора "N -> 1_из_M", придется взять еще пару I/O из другого порта. Итого, на всякие "2..3 кнопки, 3..4 "технологические" вывода" останется два или почти два порта.

Опишите дешифраторы, м.б. спланировать точнее.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт окт 09, 2015 21:24:46
slavokhire5
Привет всем котам. Имеется нубский вопрос по СИ и моим любимым указателям. помогите разобраться

Имеется внешняя ЕЕПРОМ. в ней лежит куча настроек в виде упакованных структур. Прочитать всю структуру проблем нет:

Код: Выделить всё

M95_read(SET_PAGE_START, (void *)(&settings), sizeof(settings));
скармливаем ф-ции чтения адрес начала читаемой структуры в ЕЕПРОМ(SET_PAGE_START), указатель на нужную структуру в ОЗУ (&settings), и размер структуры (sizeof(settings)).

Но если мне понадобится записать один из элементов (допустим, его зовут value) структуры в ЕЕПРОМ, как это короче сделать? (это вопрос №1)
Приходит в голову чтение по адресу структуры + адрес элемента ВНУТРИ структуры (или его смещение от начала структуры, не знаю как это правильно сказать). получается жутко длинная и не читаемая колбаса такого вида:

M95_write(SET_PAGE_START + смещение_внутри_структуры , (void *)(&settings.value), sizeof(settings.value));[/code]

вопрос №2: как правильно это смещение рассчитывать? я делаю так: смещение_внутри_структуры = *(settings.value) - *settings;
но кокос говорит мне, что я неправ - invalid operands to binary - (have 'uint8_t *' and 'struct settings)

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт окт 09, 2015 21:46:39
arkhnchul
slavokhire5 писал(а):Приходит в голову чтение по адресу структуры + адрес элемента ВНУТРИ структуры (или его смещение от начала структуры, не знаю как это правильно сказать). получается жутко длинная и не читаемая колбаса такого вида
смещение и зовется это.
Нечитаемая колбаса - да, адресная арифметика она такая :dont_know:
slavokhire5 писал(а):я делаю так: смещение_внутри_структуры = *(settings.value) - *settings;
если правильно помню, то так:
смещение_внутри_структуры = &(settings->value) - settings;
значение_внутри_структуры = *(settings + смещение_внутри_структуры)
могу ошибаться, птичий язык адресной арифметики никогда не давался(

Re: Вопросы по С/С++ (СИ)

Добавлено: Сб окт 10, 2015 09:43:05
BorisSPB
Есть такой макрос offsetof.
Все потроха спрятаны в нем, а в коде имеем читаемый и понятный текст...

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 19, 2015 02:20:52
Chip115
Всем привет!
Ломаю голову, а что делает вот эта команда?

Код: Выделить всё

*((volatile unsigned char *) (0x77200480)) = 0x00;

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 19, 2015 06:25:04
WiseLord
Обнуляет ячейку в памяти по этому адресу.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 19, 2015 09:52:07
Jack_A
Интересно, откуда выцарапана эта хрень с почти 2-гигабайтным адресом ? Мне бы МК со столько памяти :)

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 19, 2015 11:03:20
ARV
Jack_A писал(а):откуда выцарапана эта хрень с почти 2-гигабайтным адресом ?
ARM же наверняка, виртуальные адреса...

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 19, 2015 11:57:36
kalobyte
вопрос у кого есть студия 2013
внезапно надо модифицировать прогу http://winapi32.narod.ru/#3 ruslat
индикатор раскладки клавиатуры

я его сбираю на своей системе 8.1 64бит
запускаю на 8.1 64, но на ней не установлены длл от мс, а на моей идут вместе со студией

прога автора же работает без запроса длл, а моя собранная просит msvcr120.dll

я загуглил и там пишут, что надо в разделе с++ выбрать ключ /MT
однако любая комбинация тамошних ключей ничего не дает
прога простая, винапи

вопрос 2
там есть некие магические цифры
case 1049:
tnid.hIcon = hIconRus;
я загуглил, но так и не понял этих цифр
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Russian (ru) 0x19 LANG_RUSSIAN Russia (RU) 0x01 SUBLANG_RUSSIAN_RUSSIA
1049 это 0х0419
где взять магическое число для казахской раскладки?

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн окт 19, 2015 13:58:46
Siarzhuk
kalobyte писал(а):я загуглил и там пишут, что надо в разделе с++ выбрать ключ /MT
Для VS 2008 статическая версия рантайма выбирается так: свойства проекта -> Configuration Properties->C/C++->Code Generation->Runtime Library->Multi-threaded /MT
kalobyte писал(а): LANG_RUSSIAN Russia (RU) 0x01 SUBLANG_RUSSIAN_RUSSIA
1049 это 0х0419
где взять магическое число для казахской раскладки?
в хидере WinNT.h Platform SDK:

Код: Выделить всё

#define LANG_KANNADA                     0x4b
#define LANG_KASHMIRI                    0x60
#define LANG_KAZAK                       0x3f
[...]
#define LANG_RUSSIAN                     0x19
[...]
#define SUBLANG_KAZAK_KAZAKHSTAN                    0x01    // Kazakh (Kazakhstan) 0x043f kk-KZ

Код: Выделить всё

GetKeyboardLayout function.   [...] The low word contains a Language Identifier for the input language [...] A language identifier is constructed using the MAKELANGID macro. The following illustration shows the format of the bits in a language identifier.


+-------------------------+-------------------------+
|     SubLanguage ID      |   Primary Language ID   |
+-------------------------+-------------------------+
15                    10  9                         0   bit

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 20, 2015 05:21:43
pokk
Добрый день, что-то поднадоело мне в iar предупреждение:

Код: Выделить всё

Warning[Pa050]: non-native end of line sequence detected (this diagnostic is only issued once)  .........
Я так понимаю iar ругается из за невидимого символа что типа не так на следующую строку перехожу, только вот какая ему разница ?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 20, 2015 07:02:00
Chip115
WiseLord писал(а):Обнуляет ячейку в памяти по этому адресу.
Можно ли написать так (исходная запись *((volatile unsigned char *) (0x77200480)) = 0x00;)

Код: Выделить всё

 volatile unsigned char * 0x77200480 = 0x00;
Зачем нужна первая звездочка?

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 20, 2015 07:06:00
GARMIN
Первая звёздочка показывает, что по этому адресу лежит указатель на ячейку памяти, которую ты обнуляешь.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 20, 2015 08:24:50
Siarzhuk
Chip115 писал(а):

Код: Выделить всё

 volatile unsigned char * 0x77200480 = 0x00;
Нельзя. Вы пытаетесь объявить указатель на unsigned char с именем 0x77200480 и инициализировать его в 0. Имена переменных, начинающиеся цифрами, запрещены - компилятор осмотрит вас с сочуствующим недоумением. ;)

0x77200480 - просто числовой литерал;
(unsigned char*)0x77200480 - приведение типа - результат этой операции - указатель, который уже можно в оном качестве скормить компилятору. Указывает на область памяти по соответствующему адресу;
*(unsigned char*)0x77200480 - разыменование указателя - получение доступа на чтение из (если справа) либо на запись в (если слева) область/области памяти на которую указывает указатель. Тип указателя определяет размер модифицируемой памяти - в данном случае 1 байт.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 20, 2015 08:32:53
Siarzhuk
pokk писал(а):

Код: Выделить всё

Warning[Pa050]: non-native end of line sequence detected (this diagnostic is only issued once)  .........
Стандартный EOL для Windows - CR/LF, у вас-же, вероятно, исходные тексты содержат строчки, добавленые в Unix/Mac редакторах, либо полностью используют LF в качестве концов строк. Решение - открыть тексты в редакторе, менее дубовом чем Notepad и сохранить с родными для хост-системы концами строк. ЕМНИП Notepad++ такое может, сам пользуюсь более мне привычным vim-ом.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 20, 2015 08:37:07
Chip115
Siarzhuk писал(а):
Chip115 писал(а):

Код: Выделить всё

 volatile unsigned char * 0x77200480 = 0x00;
Нельзя. Вы пытаетесь объявить указатель на unsigned char с именем 0x77200480 и инициализировать его в 0. Имена переменных, начинающиеся цифрами, запрещены - компилятор осмотрит вас с сочуствующим недоумением. ;)

0x77200480 - просто числовой литерал;
(unsigned char*)0x77200480 - приведение типа - результат этой операции - указатель, который уже можно в оном качестве скормить компилятору. Указывает на область памяти по соответствующему адресу;
*(unsigned char*)0x77200480 - разыменование указателя - получение доступа на чтение из (если справа) либо на запись в (если слева) область/области памяти на которую указывает указатель. Тип указателя определяет размер модифицируемой памяти - в данном случае 1 байт.
Спасибо что разжевали! Еще путаюсь с этими указателями )

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср окт 21, 2015 03:24:29
kalobyte
Siarzhuk писал(а):// Kazakh (Kazakhstan) 0x043f kk-KZ
что-то я не понял, откуда 04?
#define SUBLANG_KAZAK_KAZAKHSTAN 0x01
Siarzhuk писал(а):Для VS 2008 статическая версия рантайма выбирается так
я там и выбрал, но все равно просит новую длл