Форум Херсона. Форум Херсонской молодежи.

Форум Херсона. Форум Херсонской молодежи. (http://forum.norma4.net.ua/)
-   Программирование (http://forum.norma4.net.ua/programmirovanie/)
-   -   Загальні запитання (http://forum.norma4.net.ua/programmirovanie/90052-zagaluen-zapitannya.html)

VoVaN 04.12.2017 10:43

Загальні запитання
 

Вложений: 2
Колупаю зараз драйвер Fat32. Щось він некоректно читає деякі накопичувачі, зокрема ЮСБ-флешку, форматовану віндамисьомими.

По порядку.
Драйвер читає MBR та намагається інтерпретувати. Знаходить записи щодо розділів:
Цитата:

00000000000000000000000000000000 - немає
00020300051468EC80000000809F7800 - є
00000000000000000000000000000000 - немає
00000000000000000000000000000000 - немає
Далі розбирає запис 00020300051468EC80000000809F7800.
І на цьому етапі трапляється якесь фіаско. А саме - параметр початкового LBA розділу (@ 0x1D6). Тут він дорівнює 0x80 або 128 dec.
Вложение 277810
(с) WinHEX

Початковий сектор же в нас насправді 0х100 або 256 dec. І WinHEX цю магію вміє.
Вложение 277811

Драйвер чомусь вважає що номер першого сектору розділу тотожний початковому LBA (я донедавна теж так вважав. Та навіть сам WinHEX називає це "Sectors preceding partition". WTF?!) та шукає файлову таблицю у секторі 0х80, хоча насправді вона лежить за адресою 0х100. І так, якщо просто зсунути число на один розряд вліво (чи домножити на два) все працює вірно. Але очевидно що додатково множити на константу - то є скажений костиль і так робити не можна. Я підозрюю що там має бути не константа :) А якесь число яке звідкись береться.
Я ХЗ, чи то якась нова специфікація яку ми з цим драйвером не знаємо, чи то що.
Хто знає?

* * *

Все, розібрався. Треба було одразу звернути увагу на ідентифікатор типу розділу, який 0х05 замість очікуваного 0х0В. Тобто падлюча вінда замість того щоб зробити просто первинний розділ з ФАТом, робить логічний розділ за адресою 0х80, у якому розміщає таблицю з вказівником на єдиний розділ з ФАТом за адресою 0х80 від початку цього розділу (а не у абсолютних координатах), тобто насправді 0х80+0х80 = 0х100.*
Р - Раціоналізаторство. А драйвер маленький і не може у логічні розділи. Доведеться додати в нього трішечки магічної рекурсії.
От як правильно задане запитання допомагає знайти відповідь :)

* - і це черговий раз демонструє, чому у жодному разі не можна використовувати костилі які надають просте рішення проблеми, суть якої наразі не зрозуміла.

ПС
Пропоную тему залишити відкритою та приліпити щоб мені було соромно що я одразу не подумав про логічні розділи не плодити теми задля одноразових запитань.

Lukas 04.12.2017 11:52

Слушай, я конечно ничего не смыслю в этом, но что-то мне подсказывает, что нужно не умножать на 2, а прибавлять 1CF 1D0 по формуле. Создай еще один раздел, и если там так же параметр 1D6 будет 128, то значит это уже смещение внутри раздела.
Почитай с 20 стр

Почесав затылок, юзер дописал через 4 минуты
ой, не заметил, что уже решилось.
В книжке в примере 1 дескриптор не пустой, как у тебя.

Debian 04.12.2017 18:59

Это ты FatFS мучаешь?

VoVaN 04.12.2017 19:06

Цитата:

Сообщение от Debian (Сообщение 1350934)
Это ты FatFS мучаешь?

Угу. Написаний як гівно :(

Debian 04.12.2017 19:23

Цитата:

Сообщение от VoVaN (Сообщение 1350937)
Угу. Написаний як гівно :(

юзай http://ru.bmstu.wiki/Chan_FAT


тю... это ужэ одно и тоже Оо
раньше было разное

Lukas 04.12.2017 21:02

Цитата:

Сообщение от VoVaN (Сообщение 1350937)
Угу. Написаний як гівно :(

мама дорогая, ФатФС от Чана, но не Джеки, в нете считается самой шикарной библиотекой... Особенно если контроллер слабенький как тинька85 Petit-Fatfs в первую очередь рекомендуют все по умолчанию. Никто говна в нем не увидел.

VoVaN 04.12.2017 21:57

Цитата:

Сообщение от Debian (Сообщение 1350949)
тю... это ужэ одно и тоже Оо
раньше было разное

Я щось теж не зміг зрозуміти де тут сміятися :)

Цитата:

Сообщение от Lukas (Сообщение 1350973)
мама дорогая, ФатФС от Чана, но не Джеки, в нете считается самой шикарной библиотекой... Особенно если контроллер слабенький как тинька85 Petit-Fatfs в первую очередь рекомендуют все по умолчанию. Никто говна в нем не увидел.

По-перше, я не знаю що там у якого Джекі Чана, мова йшла про бібліотеку яку роздають ST. По-друге - обґрунтування моєї оцінки міститься у першому псті, і це не єдина підстава так вважати.

VoVaN 05.12.2017 10:02

Нібито патч :)

ff.c, рядок #3064

Код:

br[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0;
замінити на

Код:

switch (pt[PTE_System])
{
case 0: // empty record
        br[i] = 0;
        break;
                       
case 0x05: // extended/CHS
        // here must be converter CHS->LBA, but it was fucked off. Because CHS sux!
case 0xF0: // extended/LBA
        bsect = ld_dword(pt + PTE_StLba);
        if (check_fs(fs, bsect) == 2) // I have no partition, but I have something better. Image of partition!
                br[i] = bsect + ld_dword(fs->win + MBR_Table + PTE_StLba);
        else
                br[i] = 0;
        break;
                               
case 0x0B: // clearly, FAT
default: // Some other mysterious CHUPACABRA. Let`s leave it alone.
        br[i] = ld_dword(pt + PTE_StLba);
        break;               
}

Це не остаточна версія, а швидке лагодження. Більшість проблем залишилися на місці, але тепер працюють розширені розділи.
По-перше треба уточнити щодо специфікації використання типів 05/F0 та їх адресацій, а також додати конвертор адреси з циліндрів у логічні блоки (але, на скільки я міг помітити, інформація дублюється, то ж у моєму випадку працює і так). По-друге - тут контролюється тільки перший логічний розділ з розширеної таблиці; якщо раптом буде задіяно другий (хто знає цю вінду) - його не побачить, то ж було б непогано додати гілку або цикл (щоправда це викличе складнощі з місцевою реалізацію мульті-партишену). По-третє - насправді існує набагато більше ідентифікаторів типу ФС (в тому числі і сумісних), і варто було б їх теж уміти вірно інтерпретувати. Але це вже інша історія.

ПС
Ні, серйозно, підхід "якщо тип ФС не нуль - значить це ФАТ" - це нормально?!

VoVaN 10.01.2019 10:58

Вложений: 2
Математики, допоможіть!

Контекст:
Вложение 284320
Є деяка точка F у декартових координатах. Її з'єднують з початком координат відрізки A та B (вони рівні за довжиною, тобто A=B, та їх довжина відома). Треба визначити кути α та β.
Ця задача має тривіальне рішення через теорему Піфагора та трішечки тригонометрії: визначаємо довжину С, ділимо навпіл, визначаємо кут A0C і далі до кінця - нічого складного, шкільний рівень. У кінці ми маємо один кут через арксинус, а інший через суму курів трикутника.

Задача:
Те ж саме, але у векторах.
Вложение 284321
Є вектор V, який є різницею векторів С та С'
V = C'-C
Де, в свою чергу, С = А+В, С' = А'+В'.
Так само як і у першому прикладі |A|=|B|=|A'|=|B'|=const.
Треба знайти ті ж самі α та β.
На перший погляд це зводиться до першої тривіальної задачі, адже вектор то є дві точки. Але проблема в тому, що ця математика описує фізичну систему, внутрішній стан якої змінюється згідно з вектором V. Для керування цією системою потрібно знати природу зміни α та β протягом переходу стану системи по вектору V. Тобто у результаті треба отримати якесь аналітичне вираження α та β, яке відповідає вектору V. Наприклад, функцію від часу (якщо сприймати вектор V як переміщення фізичної точки на площині): α(t), β(t), що відповідають значенням кутів продовж переходу по вектору та Δα(t), Δβ(t), що відповідає швидкості зміни кута на кожній точці цього переходу. Інтерполяція у багатьох проміжних точках, на жаль, для цього не дуже підходить: сигнали керування α та β мають бути виключно точними та неперервними.

Я чимось заднім підозрюю що ця задача так само тривіально вирішується із застосуванням диференційного числення, але ніасіліл.
Є ідеї як це зробити?

VoVaN 14.01.2019 13:54

Вложений: 1
Цитата:

Сообщение от VoVaN (Сообщение 1389738)
Я чимось заднім підозрюю що ця задача так само тривіально вирішується із застосуванням диференційного числення, але ніасіліл.
Є ідеї як це зробити?

Начебто трохи розібрався.
Вложение 284401
Якщо перейти у полярну систему координат (α;R) то кут β залежить лише від довжини |R|. Інші кути розраховуються арифметично. І перше і друге легко диференціюється.
Далі, цільовий вектор виражається у вигляді параметричних лінійних функцій від загального коефіцієнту t[0;1] (можна уявити що це час - тоді вектор відповідає рівномірному руху матеріальної точки на площині).
Тепер залишається лише підставити параметричні функції у α(t) та R(t) після чого продиференціювати. Але це вже якось трохи пізніше О_о
Начебто виглядає не дуже складним (хоча і дуже громіздким).
Кінець-кінцем сподіваюся отримати першу похідну для обох кутів по dt.

ПС
це відчуття коли спаяти електроніку значно простіше ніж написати їй математичний апарат.

Santa 14.01.2019 17:09

Цитата:

Сообщение от VoVaN (Сообщение 1390098)
Я чимось заднім підозрюю що ця задача так само тривіально вирішується із застосуванням диференційного числення, але ніасіліл.
Є ідеї як це зробити?

Наверное прикольно- сам себе себе писать???))

ustas 15.01.2019 13:20

Это не сам себе, а поведение адекватного человека который делится тем что может пригодиться и другим.
А вот флудить везде - это за гранью адекватности.

VoVaN 16.01.2019 09:33

Вложений: 2
Цитата:

Сообщение от VoVaN (Сообщение 1390098)
Але це вже якось трохи пізніше О_о

Слава роботам та штучному інтелекту!
Вложение 284429
Вложение 284430
God bless Wolfram|Alpha.
Дуже зручний інструмент для усілякої наукової роботи, особливо коли у виші мав 4- з матану.
...
Тепер похідні можна підставити у вищенаписані вирази, завантажити цього монстра у мікроконтролер і дивитися у який бік з нього піде дим )))
Як не сильно піде - пізніше покажу що з цього вийшло.


Debian 23.01.2019 00:50

Цитата:

Тепер похідні можна підставити у вищенаписані вирази, завантажити цього монстра у мікроконтролер і дивитися у який бік з нього піде дим
FPU включить не забудь :D
А вообще мне кажется мусье перемудрил

VoVaN 23.01.2019 12:03

Цитата:

Сообщение от Debian (Сообщение 1390569)
FPU включить не забудь :D

Мені тут швидкість не потрібна, воно повільно міняється :)

Цитата:

Сообщение от Debian (Сообщение 1390569)
А вообще мне кажется мусье перемудрил

Є простіші ідеї як забезпечити гладке керування двома параметрами?

Debian 23.01.2019 21:21

Я если чесно не совсем понимаю задачу. Можно реальный пример что меняется и за чем надо следить?


Время на сервере: 18:28.

vBulletin 3, Copyright © 2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co