dlinyj: (Default)
У меня скопилось достаточно большое количество законченных и не описанных проектов. Сил закончить их нашёл, а пороха написать полноценную объёмную статью уже найти не могу. Поэтому, чтобы материал окончательно не пропал, буду делать некоторые заметки на полях, под названием "Проекты в стол".

Когда я ковырялся с BIOS, мне хотелось найти подходящий пример, чтобы проиллюстрировать свою статью Разработка BIOS на языках высокого уровня. Надо было, чтобы это был BIOS, проект был разработан на GCC и т.п. В результате я нашёл прекрасный проект польского студента техникума maniekx86, необыкновенно талантливого парня. Проект был демки в виде небольшой операционной системы для дискетки "Portal ending "Still Alive" as operating system", проще говоря демка из игры Portal. Там были ошибки, проект изначально был как монолитный си-файл, и работал только на дискетках. В результате, взял этот проект, склонировал и переписал, так чтобы он работал в BIOS, при этом раскидал это всё по раздельным файлам. Как оказалось, maniekx86 не тестировал его на реальном железе, и мы ещё исправляли возникшие ошибки и проблемы вживую. Не всё было доведено до идеала, но лучшее - враг хорошего, проект работает и теперь в виде BIOS.

Результатом есть благодарность в README.md проекта: Special thanks to @dlinyj for helping and testing! и куча моих коммитов в истории этого прекрасного проекта. Ну, а для вас снял ещё в марте месяце два крутых демо, которые вы можете лицезреть сегодня.

1. Still Alive on 386 DX in BIOS ROM
Демка на старом железе, на 386 процессоре. Видно, что процессор не вытягивает копирование таких больших областей памяти и там требуется оптимизация, однако демка звучит и показывает. Внимание: может быть громкий звук.



2. Still Alive on Pentium 4 in BIOS ROM
Тут мощности процессора хватает, чтобы всё просто летало. Но в силу особенностей реализации железа инициализации BIOS, для корректной работы здесь пришлось прилично попотеть. Тезисно, пришлось дополнительно копировать код программы (не элегантно, но работает).





Подробно описать проделанную работу что-то не хватает пороха, её было реально очень много. Но, главный посыл мой в том, что не бойтесь вливаться в чужие проекты, это реально очень круто и прикольно.
dlinyj: (Default)
Программисты делятся на два типа: тех кто не понимают указатели и тех кто уже понимает.
Есть функция, честно потыренная с stm32 (переношу код с стм-ки на ПК), которая считает модуль комплексных векторов.



И мне понадобилось, чтобы она возвращала вектор не в прямом, а обратном порядке. И совершенно очевидное решение.



Но есть нюанс © 💩 . В первом случае возвращает всё отлично, а во втором возвращает НУЛИ! Что я делаю не так? Я готов расписаться, что я хреновый программист и нифига не знаю си, но как?

З.Ы. Обратите внимания на прошлый пост, а главное на комментарии. Там коменты интереснее и содержательнее, чем пост. Прям как в лучшие годы ЖЖ.

З.З.Ы. Меня радует, что в коде можно вставлять комментарии в виде unicod-символов. Например, обозначить что код говно
//💩💩💩💩💩💩

Либо прям афигенный
//❤️❤️❤️❤️❤️❤️
dlinyj: (Default)
Покуда одни при каждом удобном случае мажут хабр грязью, я с большим удовольствием на нём выуживаю полезные для меня статьи, в частности:
Как защититься от переполнения стека (на Cortex M)?

Я, к сожалению, не такой лютый погромист всяких STM32 и прочих 32-х битных МК. Но таки срыв стека ловил, как раз когда переписывал предзагрузчик на одном весёлом MIPS-процессоре. Там я работал вообще на вольных хлебах, в том смысле, что весь стек инициализировался линкерным скриптом, в котором я тогда воообще не волок и брал готовый (сейчас не сильно больше волоку). В общем, суть была такова, что при вложении функции больше трёх - у меня ребутился проц. Понял я это не сразу, а путём экспериментов. В результате я тогда написал свой менеджер памяти, благо переменных было не очень много, но очень много данных и память (32 метра) была вся в моём распоряжении.

Так вот, ещё тогда я задумался, что стек - это больное и узкое место. Даже если у сильных мира сего, на которых бегает линукс, бывает срыв стека, то что бывает с маленькими процами. А что говорить про всяких ардуинщиков, которые даже об этом не думают и уверен, что у них 90% проблем - это срыв стека.

Так вот, исходя из статьи выше, я внезапно открыл для себя замечательные опции компилятора gcc -fstack-usage и... Я немного прифигел. После компиляции с этой опцией, появляется тьма файлов *.su (soviet union stack usage). Заглядываем в них, и тут я немного фигею:

...
reader.c:260:5:run_mode	48	static
reader.c:276:5:get_data_from_reader	1088	static
reader.c:293:6:free_recive_buffer	1056	static
reader.c:300:10:get_raw_data	64	static
...


Открываем функцию free_recive_buffer. Данная функция - это грязный хак-затычка, которая высасывает всё что есть в буфере uart, перед началом работы, чтобы иметь чистый буфер. Исключительно удобна при всяких опытах.

void free_recive_buffer (void) {
	uint8_t free_data [MAX_DATA_SIZE] = {0};
	get_from_reader(free_data,MAX_DATA_SIZE,100);
}


Ничего особенного, но оказывается, что переменная free_data располагается на стеке (MAX_DATA_SIZE = 1024).

Вопрос к знатокам. Я понимаю, что система у меня толстая, стек большой (кстати, а как узнать его размер в линукс?), но ведь это не есть хорошо? А если, вот я укажу там не 1024 в дефайне, а какую-нить дичь, типа 100000000? В чём преимущество размещения на стеке, в чём недостаток?

Так же, накидайте мне ещё каких-нить полезных опций компилятора gcc?

UPD Размер стека в Linux https://stackoverflow.com/questions/2275550/change-stack-size-for-a-c-application-in-linux-during-compilation-with-gnu-com
dlinyj: (Default)
Уж простят меня люди не в теме, но я пишу о том что мне важно и интересно!

Итак, открываем шампанское, заряжаем салюты и громко кричим ура: картинку удалось вывести на экран. Для этого даже была набросана и скомпилированна программа


Тот самый график, о котором я писал ранее


О моих терханиях можно почитать в комментариях к тому посту http://dlinyj.livejournal.com/609201.html

Собственно говоря, я поставил тулчейн, который мне посоветовал [Bad username or site: @ livejournal.com] мне не подошёл. И какие ухищрения я не использовал, заставить работать программу я не смог (спасибо за помощь [livejournal.com profile] vshmuk и [livejournal.com profile] paracloud ) . Путём многократного гугления, а так же с наводки товарища [livejournal.com profile] 22021977 оказалось, что для данного устройства энтузиастами пишется целый свой линукс! http://openinkpot.org/wiki (А вы говорите vogue-плееры) А следовательно должен быть и рабочий тулчейн.

Поиском "prs-505 toolchain" он был найден тут http://code.google.com/p/prs-plus/downloads/detail?name=arm-toolchain-sony-300.tar.gz&can=4&q= . После чего хелло ворд завёлся без проблем (даже без статика!). Ну дальше дело техники, согласно http://systemsand.me/sony-prs-300prs-505-hack/ набросал небольшую программку текст програмки )

Дефайны взял из кода драёвера с сайта Sony http://www.sony.net/Products/Linux/Audio/PRS-505.html файл 8track20070714.tgz (спасибо [livejournal.com profile] paracloud за наводку.

Компилировал примитивнной коммандой с минимум опций : path to toolchain/arm-unknown-linux-gnu-gcc -static showpic.c -o showpic

Без статика не захотел работать. Дальше после монтирования всех устройств, запускаем:
root@(none):/tmp/t1# ./showpic send.raw 
Show image
root@(none):/tmp/t1# 


И наслаждаемся картинкой в заглавии :).

Из неприятных багов было замечено, что картинку после гнуплота надо повернуть. Лечится переписыванием скрипта гнуплота.

Теперь осталось научится гасить консоль, пока не знаю как. Из процессов активно-запущенных, никто не вызывает подозрение ps aux )

Поговаривают, что можно сделать usb-gadget, типа чтобы книжка виделась USB-Ethernet. Но это отдельный гемморой. Готов выслушать мысли и предложения.
dlinyj: (Default)

Интересный вопрос по сям, в аспекте мультитредевого программирования.

Положим один поток создает массив, заполняет его данными и передает указатель в другой тред, где массив обрабатывается и затем высвобождается. Первичный поток после передачи создает другой массив и процедура повторяется. Вопрос с указателями: для каждого массива придется создавать новый указатель, и как тут быть с "бесконечным" количеством имен указателей? Или есть какой-то более простой и ясный путь? Быть может после передачи указателя, можно его (указатель) использовать для следующего массива?

Надеюсь я нормально выразил свой вопрос.

З.Ы. Да, я программирую в отпуске и деревне, между прополкой грядок и прочими хозделами

Posted via LiveJournal app for iPad.

dlinyj: (Default)
Правда он не работает :(. Требует ещё какой-то фигни, которую я так и не понял, как реализовать.

Такую сраненькую программку компилировало куча народу, сначала я засел в конфе embendded-talks, где мне чудовищно помог тов. Борман! За что ему нескончаемый поток респектов! Он даже самостоятельно провёл компиляцию миникома под другую архитектуру, и записал как он это делал, лежит тут: http://narod.ru/disk/14453630000/screenlog.0.bz2.html
Качаем, распаковываем, и из папки с этим файлом выполняем
time=0.1
rows=`wc -l screenlog.0 | awk '{print $1}'`
for i in `seq 1 $rows`; do head -$i screenlog.0 | tail -1; sleep $time; done ;
  reset

чтобы поставить на паузу, жми ctrl-S
что бы продолжить ctrl-q

(Кто мне подскажет как это писать и что это за формат файла?)
Собственно говоря, у меня не получилось ;). Т.к. я неудачнег :(. И в ночи, я дал SSH доступ к своему компу товарищу [livejournal.com profile] vshmuk, где он смог получить, через тот же злополучный minicom, только на моём компе, доступ к моей борде, а так же помочь мне докомпилировать этот пакет (за что ему мегареспект). Завтра, если будет не влом, систематизируем всю последовательность действий компиляции пакета. А пока наслаждаемся нерабочим миникомом:


Minicom запускается, но что-то ещё хочет


Дальнейшие пляски с бубном ни к чему не привели... Но прога скомпилилась верно, даже хелп можно посмотреть: Выплевок хелпа )
Поскольку секс с этой платой, при чём пока невзаимный, меня начал доставать, то я порывался ввести комманду fuck, и товарищ [livejournal.com profile] vshmuk сделал для меня алиас:
[root@FriendlyARM /]# alias fuck=halt
[root@FriendlyARM /]# fuck
...
System halted.

Это типа шутки ;)
P.S.Я заморочился, даже купил USB клавиатуру к своей плате. Надо сказать, найти клаву в нашей буржуинской Москве, дешевле 600 рублей было проблемой
dlinyj: (Default)
Да, я сделал это! Я написал таки свою первую программу для этой чудесной платы!


Своеобразный хелло ЖЖ :)


Программа элементарна, как день, ну для тех кто вдруг в танке, покажу:

int main(void) {
printf("Dlinyj krutoj megacoder!!!\n");
printf("http://dlinyj.livejournal.com\n");
}

Синтаксис подсвечивать не стал ;)

Чтобы оценить степень моей гемморойной замороченности, нужно представить что мне было лень грузится в линух, и я для этого на свеже поднятый [livejournal.com profile] mihhru сервак, залил арм компилятор, который там распаковал (не стал морочится с рутовскими правами и всё прописывать). Там написал эту программу, скомпилировал, перекачал far-ом на флешку, дальше запустил, как вы ввидите. Очень нехватает USB-клавиатуры. Виртуальная клава очень неудобна!

Хочу обратить внимание, как расположен дисплей и что линукс обрёл английский вид! В отличии от винце - этот линух умеет(!) сохранять настройки! Плюс, это тот самый линукс, который стоит в нокиа таблет. И под него есть великолепный SDK: http://qtextended.org/modules/mydownloads/viewcat.php?cid=4 (предпоследний в списке).

Прежде чем скомпилить консольное приложение, я пытался сделать графическую оболочку. Накидать кнопочек и т.п. Но у меня не вышло ничего скомпилировать, ибо я ни разу не работал с QT :(. Хотя внешний вид, и ЧУДОВИЩНОЕ(!!!) количество доков и примеров, даже на русском просто поражает! Может кто обучит меня QT? В цело очень порадовал интерфейс, но я совершенно неумею работать с визуальными языками (ну разве что кнопочки на панель таскать... Тема офигительная. Круто было бы с кем-нить посидеть в выходные и покодить, никто не желает покодить для армов? :D
P.S. Да, я налажал с chmod ;)
dlinyj: (Default)
Столкнулся с забавным затыком, нужно было исключить срабатывания при переменной xtra равной 1, 5, 25 и 125. Я записал:

...
if ((xtra != 1) || (xtra != 5) || (xtra != 25) || (xtra != 125)) {
...}


В результате срабатывало всегда! Просто взорвал себе мозг, оказывается надо было записать

...
if ((xtra != 1) && (xtra != 5) && (xtra != 25) && (xtra != 125)) {
...}


Банально, но был долгий затык. Народ, скажите, как мне сравнивать значения типа float? Задача определить чётко, после вычислений - равно ли оно заданному значению.

Округляю число так:

		ErValue *= 100000;
		ErValue = ceil(ErValue);
		ErValue /= 100000;


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

UPD Сей дурацкий на первый взгляд вопрос, возник при разборе полётов одной программы. Она выводит число с кучей знаков после запятой. Когда я компилятором вывожу число с 7 знаками после запятой, то выходит другое число, когда я округляю алгоритмом приведёным выше (5 знаков после запятой), то близкое к округленю компилятором, но очень отличающееся от исходного. Вот например:

dlinyj: (Default)
Я таки решил изучать Си серьёзно (ну по совместительству с++, хотя пока не делаю на него упор). По совету [livejournal.com profile] cluster_d прикупил две книжечки


Не ржать, я чайник


Моя цель изучить си и писать на нём под линукс, компилировать программы и драйвера. В общем разобратся в синтаксисе. Немного почитав книжечку для чайников, я понял что примеры в книге не компилятся в линухе. В результате, под чутким руководством [livejournal.com profile] vshmuk я написал свою первую программу Хелоу Ворд. Что приятно, уважаемый товарищ описал процесс обучения в своём автономном блоге, который (о ЧУДО!) транслируется теперь в ЖЖ: http://geotechnoblog.livejournal.com/ рекомендую! Я искренне надеюсь, что многоуважаемый [livejournal.com profile] vshmuk и [livejournal.com profile] cluster_d (которыый показал уже пример арифметических выражений), не сочтут за труд отвечать на глупые вопросы. Так же сегодня попробовал тупо скомпилить для AVR (!) программу [livejournal.com profile] cluster_d. Одна скомпилировалась вполне успешно (мигание светодиодом), вторая заругалась, и отказалась компилится (не разбирался). Сцал кипятком. Теперь хочу понять как компилировать софт для роутера, на КОМПЕ! Пока задача минимум вкурить в синтаксис си, поигратся с примитивными программами (матрицы всякие, циклы и т.п.). Понять особенности си под линь, и начать шпарить.
Вторая задача, это найти исходники (ага, даже не знаю с чего начать) драейвера USB клавиатуры под линукс, и скомпилировать её под роутер (Вы что, наивно полагаете, что после отпуска я остыл к этой железяке?). И написать другой драйвер, для управления дисплеем. Ну и может скомпилировать драйвер FT232. В общем вкурить во все тонкости. Пока особо интересует работа с железом под линуксом на си.

Написал сумбурно, эмоционально, но надеюсь для тех кто в теме понятно.
З.Ы. [livejournal.com profile] gorl я помню твоё обещание ;). Но пока немного сам вкурю.

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 10:15 am
Powered by Dreamwidth Studios