Search
Write a publication
Pull to refresh
26
0
Анатолий @longtolik

Пользователь

Send message
Спасибо за тему. Хотелось бы также увидеть материалы, описывающие красоту программирования на ассемблере и для чего он, собственно говоря, нужен. Например, как в статье «Программные трюки на ассемблере» из журнала «Микропроцессорные средства и системы». Про рекурсию, реентерабельность программ и про сопрограммы, по-моему, интересно хотя бы для общего развития.
Сравнение ассемблеров/архитектур — когда-то ассемблер DEC мне казался самым лучшим (там архитектура позволяла циклы чтение-модификация-запись при работе с памятью), потом было разочарование от ассемблера для Intel x86 (тут надо делать операции через регистр-аккумулятор AX/EAX и, если уж мы читаем слева-направо, то почему надо писать MOV DX,200, а не MOV 200,DX?). Позже, на Palm III познакомился с ассемблером Pila для Motorola 68000 — вот где красивая архитектура!
Еще интересно было бы узнать про самомодифицирующийся код (и про то, что его нельзя уже изменить, когда попал в конвейер команд/данных, что может быть использовано для определения, что ваша программа прогоняется под отладчиком.
Также можно было бы включить в будущие статьи, например, проект из блога компании Intel, в котором в приложение для Android вставлен и работает программа на Ассемблере. То есть, получается, мы можем писать на Ассемблере для Android! Ну, хотя бы чуть-чуть, для native библиотек.
Еще вопрос: есть книга П.Брамм, Д.Брамм «Микропроцессор 80386 и его программирование». В ней описаны, в частности, дескрипторы страниц и перевод процессора в защищенный режим. Не понятно (простите за невежество), если ОС переводит процессор в защищенный режим и участки памяти вообще не видны для приложений пользователя, то как тогда вирусы могут туда проникнуть? Возможно, меняя код в BIOS или на загрузочном диске.
Для ARM Ассемблера хотелось бы узнать, как включать/останавливать ядра.
Когда-то я получал улучшение производительности, поэтому и посоветовал попробовать.
(Конкретно, работал с проектами на Ассемблере и С, время получения исполняемого файла было до 17 секунд в случае с HDD, и 1 секунда — при помещении всех файлов в RAM диск). Диски были медленные и память — тоже, а отношение скорости обмена всегда в пользу RAM.
Тогда легче было определить «всех участников проекта» и скопировать на RAM диск.

Вот сейчас проверил. Android Studio, маленький проект ~2000 файлов объёмом ~150 MB.
При сборке загрузка диска SSD доходит всего лишь до 20%, скопировал проект на RAM диск, запустил сборку, загрузка диска практически вообще не видна. Проект собирается за 3..5 секунд на Core I3(2 ядра, 4 потока) и меньше секунды на Core I7 (4 ядра, 8 потоков).

Получается, можно запустить монитор ресурсов и определить, какова нагузка на диск при сборке проекта, если она небольшая, то и применение RAM диска будет неэффективно.
Но, если будет существенная, тогда можно и попробовать.

P.S. Если кто-то кому-то советует (из благих побуждений), то можно совет просто проигнорировать, это — не призыв к действию. Поискать — значит, посмотреть и определить, какой вариант лучше подойдёт из имеющихся. На порядок — не всегда в 10 раз, если система двоичная, то в 2 раза, восьмеричная — в 8 раз, есть даже пятидесятиричная Radix50 (но 50 тут восьмеричное число :). И не все собирают webkitы.
Если у кого-то сборка не зависит от скорости диска, то ему можно использовать обычный жёсткий диск вместо SSD (какая ведь разница?).

И вот откуда это идёт:
www.apple-iphone.ru/news/novyjj-mac-mini-provalil-testy-benchmarka-geekbench
Почему же в Apple выбрали двухъядерные процессоры для новых Mac mini? В Primate Labs считают, что причиной такого выбора стали производственные проблемы, связанные с использованием иного типа сокета четырехъядерным Intel Haswell. Установка подобного процессора вынудило бы Apple разрабатывать и выпускать новую модель материнской платы, а это непременно повлияло на стоимость устройства.
Но Вы правы, там дело не в процессорах, а в разъемах.
Apple перешла исключительно на Dual Core в новых Mac mini потому что 2-ядерным процессорам Haswell нужен один разъем-сокет для подключения логической платы и процессора, тогда как версии Haswell с четырьмя ядрами нужны несколько сокетов. Это означало бы, что Apple пришлось создать сразу две разных платы для Mac mini (своего не самого популярного продукта), тогда как все остальные Mac работают на едином решении.
Это отсюда:
yablyk.com/100283-mac-mini-2014-rabotaet-medlennee-modelej-2012-goda
Два года назад я это читал…
Здравствуйте, разделяю Вашу радость. Тоже очень доволен своим Mac mini (MD388RS/A).
Два года назад смотрели в магазине кастрюли, увидел Mac, новенький, с 4-х ядерным Core I7. Почитал, сравнил и на следующий день купил (со скидкой, так как не последняя модель, обошелся в 31625 рублей!).
Apple, как писали, подвела фирма Intel, которая изменила топологию для I7 в новых поколениях. Чтобы не переделывать материнскую плату, оставили I5 с двумя ядрами, у которых ножки совпадали). Да ещё у модели 2012 года память легко заменяемая, а в более поздних — впаянная на плату. Поставил SSD Drevo на 480 GB.
Для большего повышения производительности могу посоветовать поискать RAM disk. Для Windows он существует, до 4GB бесплатно, больше — за плату. Если файлы с проектом на него переписать, то должно получиться ещё на порядок быстрее.
Для мобильности можно посмотреть USB3 дисплеи. Получится что-то вроде ноутбука.
А бывают ещё м-диски, сайт: www.mdisc.com
1000 лет — это много, проверить невозможно (как у Хаджи Насреддина, когда он осла говорить пытался научить...)
Смысл приобретения такого компьютера — да хотя бы в экономии на лицензионном софте. Можно носить хоть домой, хоть на работу, хоть на презентации и прочее. С одним пакетом программ. Кроме того, обновления — если у вас несколько компьютеров, дома и на работе, приходится тратить время на обслуживание каждого. Проверки на вирусы, резервное копирование. А тут — один компьютер всего!
Пользуюсь Gigabyte Brix лет пять уже. Очень доволен!
Возможно, скоро появится HP мини-PC с Intel Xeon, если кому нужно большее быстродействие.
На мой взгляд, так легче спрятать широкий ободок вокруг экрана. У первых и вторых Zenwatch маленький экран на большом корпусе смотрится отвратительно. А на круглых — нормально.
Молодцы!
Когда-то в голову пришла идея — дополнить турбину центробежным разделителем воздуха на кислород и азот.
Можно было бы в мотор подавать обогащенный кислородом воздух.
Как раз на вашей установке легче всего проверить идею.
Удачи!
Есть ещё клей для стекла и хрусталя, солнечного света достаточно для отверждения. Стоит дешево.
Насколько я понимаю, питание на чип подаётся постоянно, кнопка отключает ЖКИ. Поэтому батарейка и «садится», независимо от того, работает ли он в режиме измерения или просто лежит в футляре. Те, с которыми я работал, все «помнили» показания, но если вытащить батарейку, то «сбрасывались». У всех был разъем для подключения, но вот протокол может быть нескольких типов.

Если это критично, то можно сделать так: микроконтроллер считывает показания в ОЗУ (регистр), цепь питания двухступенчатая, то есть, присутствует ещё что-то вроде конденсатора или ионистора. Напряжение от блока или элементов питания подаётся на один из входов микроконтроллера, и когда оно падает ниже критического уровня, наступает прерывание, в ходе обработки которого показания быстро переписываются в энергонезависимую память. После включения, если они не пусты, то считываются в ОЗУ.

P.S. Раньше микро-ЭВМ успевали всю свою память записывать на диск, когда напряжение 220 Вольт пропадало, но постоянное напряжение ещё держалось на конденсаторах блока питания.
Здравствуйте, можете попробовать ещё датчик от электронного штангенциркуля, (digital caliper). Он работает по IIC, в основном.
На датчике мыши я делал энкодеры, и они меня не разочаровали. Посмотреть можно здесь:
http://www.rlocman.ru/shem/schematics.html?di=162625 там же и ссылки на некоторые чипы.

В ссылке приведен список телефонов (видите там Мегафон?) с вредоносным программным обеспечением на уровне прошивки.
http://thehackernews.com/2016/12/hacking-android-smartphone.html?m=1
Мне как пользователю, не интересны подробности, у меня "заикается" и перерывается связь. Если не поможет замена SIM карты, буду прощаться с Мегафоном, с которым с 2002 года.

Насколько я помню, оперный театр в Сиднее использует подобную технологию, нагревающиеся блоки кондиционеров погружены в океан.
Про горы молчу — не надо плавить ледники :)
Здравствуйте, вот еще энтузиасты, но они для ARM планировали написать OS, а DexArm сделал версию для х86, демо — в ссылках. Может, они бы присоединились к Вашему пректу.
http://www.friendlyarm.net/forum/topic/3529
http://www.friendlyarm.net/forum/topic/6495
Неблагодаррое это дело, (но очень интересное!)…
Удачи Вам!
Ещё есть М-диски, обещают 1000 лет сохранности.
http://www.mdisc.com
Здравствуйте, Игорь.

Не буду долго Вас отвлекать от дел.

Теперь я понял суть и целиком согласен с доводами.
Да, есть там, что подправить.

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

По поводу, что main() должна быть внизу — частенько вообще всё бывает в отдельных файлах.
Если однотипностей всего 4 штуки, то, возможно, проще их друг за другом привести. Например, иногда, можно проще написать: val[1]=2; val[2]=3; val[3]=4; val[4]=5;, если их 4 штуки, чем делать цикл

volatile — это правильно, а к «addr» еще и const, и unsigned добавить, особенно это существенно в случае микроконтроллеров, чтобы компилятор знал, кого — в ROM, а кому — RAM подавай. (В данном случае, они всё равно все в RAM попадут).

Можно еще написать: static void K_EINT16 (void)…

У нас был преподаватель по начерталке, профессор Рылов. Как-то он поставил на доске мелом точку, потом стер её. Сказал: «точку ставить не будем, затемняет чертёж!».

Все эти примеры нисколько не претендуют на образцовость, это — «скелетоны», чтобы все поняли, как применить вызов или обратиться к устройству. А вот сложная конструкция может отпугнуть новичка, тем более не программиста, а инженера.

Но я, конечно же, учту эти замечания, спасибо.

С уважением,
Анатолий

Во-первых, здравствуйте!

(А у Вас отсутствуют операторы приветствия и прощания, не обижайтесь).

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

Я хотел помочь заинтересованным людям, если кому пригодится, а мне-то ничего на надо. Дарёному коню в зубы ведь не смотрят.

Насчет оператора goto — примерно так я и думал, что будет такое отношение, но хотелось показать, что его тоже можно применить, наряду с while. И еще — в операционной системе Unix (или Linux?) все-таки констатировали применение хотя бы одного оператора goto (причем, с таким сожалением, как будто преступление совершили). Получается, Unix — плохой, написан ужасно…

Искал подтверждение, нашел статью про goto тут, на Хабре: habrahabr.ru/post/114211

Много пользователей из Индии, Колумбии, Пакистана и т.д. Для них goto понятнее, а потом они переходят на while.

Вот пример (один из них), вроде тут и структуривать особо нечего:
// RT-210s (StartOS) K1...K4 Interrupt Example Sketch

#define	U32	unsigned int
#define	U16	unsigned short
#define	U8	unsigned char
////////////////////////////

// VIC
#define VIC0RAWINTR	 (*(U32 *)0xF2000008)
#define VIC0IRQSTATUS (*(U32 *)0xF2000000)
#define VIC0FIQSTATUS	 (*(U32 *)0xF2000004)
#define VIC0INTENABLE	 (*(U32 *)0xF2000010)
#define VIC0INTSELECT	 (*(U32 *)0xF200000C)

#define VIC0VECTADDR16 (*(U32 *)0xF2000140)
#define VIC0VECTADDR17 (*(U32 *)0xF2000144)
#define VIC0VECTADDR18 (*(U32 *)0xF2000148)
#define VIC0VECTADDR19 (*(U32 *)0xF200014C)
#define VIC0ADDRESS	    (*(U32 *)0xF2000F00)
#define EXT_INT_1_CON	 (*(U32 *)0xE0200E04) // EXT_INT[8]...EXT_INT[15]	
#define EXT_INT_1_MASK (*(U32 *)0xE0200F04)
#define EXT_INT_1_PEND (*(U32 *)0xE0200F44)
#define EXT_INT_2_CON	 (*(U32 *)0xE0200E08) //EXT_INT[16]...EXT_INT[23]
#define EXT_INT_2_MASK (*(U32 *)0xE0200F08)
#define EXT_INT_2_PEND (*(U32 *)0xE0200F48)
#define GPH2CON (*(U32 *)0xE0200C40)
#define GPH2DAT (*(U32 *)0xE0200C44)

void Isr_Init ( void );
void K_EINT16 (void);

int i;
int addr, num;

Main	(void)
{
  Isr_Init ( );
  while (1)
  {
    if ( num )
    {
	Printf ( 10, 20,"Key ISR, Addr = %8x", addr );
	Printf ( 10, 30,"Key Status = %8x", num );
	Buzz ( num*1000, 20 );
	num = 0;
	addr = 0;
    } 
    i++;
    Printf (10,10,"Counter Value  = %8d", i );
    Delay ( 50 );
  }	
}
//////////////////////////////////////////
void	Isr_Init ( void )
{
 VIC0VECTADDR16 = (U32)K_EINT16;

 GPH2CON |= ( 0xF << 0 ); // Pin function 1111: EXT_INT[16]
 GPH2CON |= ( 0xF << 4 ); // Pin function 1111: EXT_INT[17]
 GPH2CON |= ( 0xF << 8 ); // Pin function 1111: EXT_INT[18]
 GPH2CON |= ( 0xF << 12 ); // Pin function 1111: EXT_INT[19]
	
 EXT_INT_2_CON  &=~( 0xF << 0 );
 EXT_INT_2_CON  |= ( 2 << 0 );  // Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 0);	// EXT_INT_2_MASK for EXT_INT[16]

 EXT_INT_2_CON  &=~( 0xF << 4 );
 EXT_INT_2_CON  |= ( 2 << 4 );//Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 1);//EXT_INT_2_MASK for EXT_INT[17]
	
 EXT_INT_2_CON  &=~( 0xF << 8 );
 EXT_INT_2_CON  |= ( 2 << 8 );//Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 2);//EXT_INT_2_MASK for EXT_INT[18]
	
 EXT_INT_2_CON  &=~( 0xF << 12 );
 EXT_INT_2_CON  |= ( 2 << 12 );//Edge 010 = Falling, 011 = Rising
 EXT_INT_2_MASK &= ~( 1 << 3);//EXT_INT_2_MASK for EXT_INT[19]

 VIC0INTSELECT &= ~(1<<16);//Set Mode bit: IRQ and not FIQ
 VIC0INTENABLE |= (1<<16);//Enable EINT[16]

 VIC0ADDRESS = 0;//Clear VIC0ADDRESS

}


void K_EINT16 (void)
{
 num = EXT_INT_2_PEND;
 addr = VIC0ADDRESS;
 EXT_INT_2_PEND |= num;//Reset reason of interrupt
}


Если кто-то захочет, просто редактирует на свой вкус и всё.

Теперь мне понятно, зачем некоторые хотели купить исходные коды — они собирались уничтожить этот ужас! Вместе с примененными структурами, указателями, адресами в стеках FAT32, TCP IP и т.д.

Про расставление скобок в операторе if написано в книге «Совершенный код», в Android Studio в настройках редактора можно указать, как их ставить.

О плюсах и минусах современного программирования можно прочесть здесь:

code.google.com/archive/p/startos/wikis/Education_of_engineers.wiki

и здесь:

www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

Жаль, что они на английском, но суть там такова, что мы теряем программистов и инженеров, а программирование стало бизнесом (в тревожном смысле).

А вообще, путь пользователя такой — сталкивается со сложностями в инициализации ARM, начинает гуглить, находит стартос, пишет первые программы, добавляет код инициализации, получает Non-OS программу.

Вот один из примеров применения:

www.cttestset.com/PageA.htm

— человек был совсем начинающим в ARM, начал со StartOS, потом сделал специализированное устройство и продает свой аппарат, ему — 74 (!) года, в 1963 году получил диплом о высшем образовании и до сих пор творит.

Еще раз спасибо за науку, с уважением и успехов Вам во всём.
Анатолий

Это маленькая ОС. (Хотя, MS-DOS тоже была однозадачной). Да, вот так получилось, ненароком. Я о слове программы в кавычках подумал, что сарказм.
У меня есть старые журналы «Микропроцессорные средства и системы», там, к примеру, были статьи о том, что «на кафедре мединститута была создана ОС...». И это был не единичный случай. И ОС была с потоками, семафорами и т.д.
Сами программные прерывания — никакое не ноу-хау, подробно описаны.
Под ноу-хау подразумевалось то, что удалось заставить их работать.
Она делает свое дело, экономит время, запускает программы и предоставляет им API.

Конечно, ее можно наворотить при желании и наличи времени.

А если я делаю конкретный аппарат и многопоточность мне не нужна?

Кроме того, всегда можно (даже на уровне программы пользователя) включить свое многозадачное ядро, например, как в uC/OS и переключать задачи, как захочется.

Можно даже uC/OS запустить с карты памяти как программу пользователя, проверял.

А ОС бывают и однозадачные. Не так ведь давно был анонс, что «iOS теперь работает в настоящем многозадачном режиме, може даже выводить несколько окон на экран и все они будут работать».
Хотя железо ARM процессоров уже давно позволяет использовать до 32 (кажется) программ по 1 Мегабайту каждая одновременно, причем, они могут быть скомпилированы для работы, скажем, в адресе 0x20000000 каждая, а загружены в разные адреса, менеджер памяти сделает так, что программы и не будут подозревать, где они находятся.

Пока я не видел таких систем. Настоящих.

Information

Rating
8,650-th
Location
Россия
Registered
Activity

Specialization

3d Modeler, Neurochip application
From 10,000 €
Assembler
C
Programming microcontrollers
Embedded system
Arm Architecture
RISC-V
Real-time operating system
Electronics Development
Development of printed circuit board