Перейти к содержанию
    

vvppvv

Участник
  • Постов

    70
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о vvppvv

  • Звание
    Участник
    Участник
  • День рождения 18.10.1967

Контакты

  • Сайт
    Array
  • ICQ
    Array

Посетители профиля

1 272 просмотра профиля
  1. Какие у вас тут любопытные споры... :)) В Си IAR AVR так и есть, да. Наверное, это установка по умолчанию, ведь кодировка символа сейчас зачастую двухбайтная. Если использовать ASCII-таблицу для байта, то никаких двусмысленностей нет: 216 char CH = 'A'; 217 PORTC = sizeof('A'); \ 00000000 E002 LDI R16, 2 \ 00000002 B908 OUT 0x08, R16 218 PORTB = sizeof(CH); \ 00000004 E001 LDI R16, 1 \ 00000006 B905 OUT 0x05, R16
  2. Я использую "//" в комментариях, а это, строго говоря, уже из плюсов. Но компилятор позволяет. :)) Вообще, конечно, всё зависит от задач, тут я полностью согласен.
  3. Я когда-то давно пробовал перейти на С++. Ну как же, это модно, нужно быть в тренде. и пр. Потом понял, что эти костыли были придуманы для человека, мыслящего как человек и неспособного мыслить как процессор. А как известно, чтобы японскому мастеру нарисовать корову - надо стать коровой. :)))) Потому я не стал себя больше насиловать, натягивая противоестественное, и скатился обратно к натуралам, в нативный для AVR Си-ассемблер.
  4. Да, компилятор его подкорашивает! Но т.к. я пишу в Си, ругается: "Error[Pe020]: identifier "nullptr" is undefined"
  5. "Error[Pe020]: identifier "nullptr" is undefined D:\_Workdir\ (.......)\main.c 499 " И в то же время 499 rc_Count_Ptr = 0; \ ??main_11: \ 000001C8 24EE CLR R14 \ 000001CA 24FF CLR R15 Я так думаю, что nullptr - это для С++.
  6. Так получилось, что к Си я пришёл через ассемблер. Если процессор допускает косвенный вызов функции с адреса 0х0000 (т.н. "мягкий" или "софтверный" ресет), а стандарт языка такое не допускает, то зачем мне такой язык нужен? Я больше железячник, а не программист. Мне ехать, а не шашечки. ))
  7. Это часть стандартной библиотеки: https://en.cppreference.com/w/c/types/NULL Сделайте include <stdlib.h> или include <stddef.h> Я не силён в теориях и реализациях языков. Вот попалась цитата: "Что будет если Разыменовать Nullptr? Отсюда следует, что если в вашей программе есть разыменование nullptr , то компилятор имеет право произвести любой код, никаких обязательств перед вами или гарантий нет. В лучшем случае ваша программа просто крешнется." Поэтому мне явно указаный "0" с приведением типа как-то спокойнее, чем "нулл" из какой-то библиотеки. :)) Так я так и хочу. Список может быть разный по длине. Всё как со строками - перебираем, перебираем, до тех пор, пока не упрёмся в ноль. Можно и так. Но тогда мы пропустим, например, посылку байта. Вместо того, чтобы функция сделала чтот-то полезное, в отпущенный ей квант времени, она просто передвинет указатель. :))
  8. Да. Но проверка на ноль (проверка на достижение границы списка указателей) очень быстрая и простая, мне показалось так удобнее будет (указатель лежит в R13:R12): 480 if (!Func_UART_ptr) \ 000001FA 2D0C MOV R16, R12 \ 000001FC 290D OR R16, R13 \ 000001FE F419 BRNE ??main_14 ====== Я вот так сделал (без претензий на совершенство :)) ============== (** Func_UART_ptr++)(); // вызвать функцию из списка if (!Func_UART_ptr) // если была последняя, Func_UART_ptr = UART_NN; // то указатель на начало списка ("MARK") И это пробовал. Нет его в IAR EW AVR 7.30.5. компилятор ругается. Да, разумеется. Описька.))
  9. Изначально аперсандов и не было. Для указателя на первый элемент или функцию он же не нужен. Это я уже после начал втыкать всё, что попало, Добавлять скобки, убавлять, квадратно-гнездовых способом. Но компилятор фыркал, мотал головой и не поддавался, гад. :)))) Спасибо!
  10. Ой спасибо! Вот ведь, блин... Посыпаю голову пеплом. ))) Семёрку убрал, она там не нужна. ВОт так вроде всё сжевалось: void (* UART_NN[])() = // Указатели на функции, последний равен нулю { UART_00, UART_01, UART_02, UART_03, UART_04, UART_05, ((void(*)(void)) 0) }; Спасибо!
  11. Помогите, пожалуйста. Что-то я заблукатил в трёх соснах :)) Идея такая. Есть набор простых функций , без аргументов, которые должны вызываться последовательно, "по кольцу". Я решил организовать массив указателей на эти функции, с тем, чтобы просто инкрементировать указатель на этот массив, и как только он упрется в ноль - значит, достигнут конец списка, переход на начало. Ну, как со строками. Все хорошо, но я что-то никак не могу сказать компилятору, что мне нужен указатель равный нулю, в конце списка. Компилятор IAR AVR, язык Си: void UART_00 (void); // Функция передачи "MARK" void UART_01 (void); // Функция передачи "SPASE" void UART_02 (void); // Функция передачи 1-го байта битового поля void UART_03 (void); // Функция передачи 2-го байта битового поля void UART_04 (void); // Функция передачи 3-го байта битового поля void UART_05 (void); // Функция передачи 4-го байта битового поля void (* UART_NN[7])() = // Указатели на функции, последний равен нулю { & UART_00, & UART_01, & UART_02, & UART_03, & UART_04, & UART_05, & ((void(*)(void)) 0) // тут ругань, "Error[Pe158]: expression must be an lvalue or a function designator }; При этом софтварный ресет в виде: ((void(*)(void)) 0)(); как косвенный вызов, прекрасно компилится, т.е. в регистровую пару Z грузятся нули. Где я подтупливаю? :))
  12. Тем не менее, тогда, и в тех реалиях, это был факт. Как говорится, "миллион мух не могут ошибаться". :)) Память ОЗУ в Синклерах версий 48кБ использовалась практически всегда "под завязку", потому любой чих сразу вылазил. Штатного теста при включении хватало. Игрушки все либо работали, либо сразу вылетали. А вот 128 кБ версии (Пентагон-128 или наш Орион-128) - там да, могли быть нюансы. Но там и посерьёзнее тесты памяти были, в виде отдельных загружаемых программ. Я собирал оба (Петагон-128 даже с дисководоми и "музыкальным процессором" AY-3-8910! :)), и искал для них нормальные микросхемы, с маркировкой.
  13. Вспоминается конец 80х годов прошлого века, эра синклеростроения. Когда мы студентами собирали разные микрокомпутеры. В ходу были микросхемы динамической памяти, КР565РУ5Г (ДИП-16). Микросхемы изготавливала наша, тогда ещё живая, электронная промышленность. Так вот, часто на Тушинском (а после на Митинском) радиорынке продавались комплекты этих микросхем без маркировки. Про Китай тогда никто и не слышал. Естественно, такие микросхемы проверялись тестом памяти, и, как ни странно, впоследствии прекрасно работали. А вот теперь вопрос - куда (и почему) девалась маркировка с них? Во времена СССР? Тогда наиболее правдоподобное объяснение было такое: после операции корпусирования партия частично проверялась. 100% результат означал отправку партии далее на операцию ненесения маркировки. Если же попадался брак, то вся партия браковалась. Но! Рачительные заводчане, образно говоря, тырили некондицию из мусорных корзин и уже сами, вручную отбраковывали, каждую микросхему. Возможно, примерно такая же схема сейчас и на китайских заводах. Врядли "мелочь" после корпусирования тотально тестируют, скорее выборочно, а значит, в случае чего просто бракуют всю партию.
  14. Может, манифесты и подтягивают что-то, только у меня с ними списки слоёв в PCB и списки листов в SCH не работали в Win7 (PCAD 2006 SP2). Удалил манифесты - всё волшебным образом заработало как надо.
  15. Доброго дня всем! Дошли руки наконец-то до опытов дубликатирования кусков готовой разводки в PCAD200x. Кому интересно - сообщаю, результат достигнут. ))) Спасибо большое всем, принявшим участие в обсуждении! В общем, наиболее подходящий вариант, это использовать команду "Edit -> Paste -> Circuit". Разобрался с галками в менюшке, в общем, если Пикаду конкретно, по пунктам, сообщить, что надо, какие цепи оставить, какие проинкрементировать (и как проинкрементировать), как поступать с позиционными обозначениями, и т.д., + предварительно проделать некоторые телодвижения в схемном редакторе, - то в итоге всё получается как надо. Прям вот как хотелось! Вот скриншот.
×
×
  • Создать...