понеділок, 9 листопада 2015 р.

Стандартна бібліотека C та SemiHosting (на прикладі STM32 і CoIDE)

Роль LibC в Linux. Зауважте, що
glibc надає значно більше інструментів,
ніж стандартна бібліотека С -- зокрема,
засоби POSIX. Нижче мови про них не буде.
(c) wiki
В попередньому пості було показано, як викристовувати CoIDE, програмуючи мікроконтролери (на прикладі плати STM32VLDiscovery). Розглянемо тепер, деякі загальні практичні питання програмування із використанням С. (В порівнянні із давнішими попередніми (1, 2) постами, тут більше подробиць, виправлено деякі помилки, і т.д.)

Увага (як часто буває в  embedded!), багато що із написаного нижче дуже сильно прив'язано до особливостей конкретного компілятора, GCC та конкретних його версій! Про Keil, можливо, колись напишу окремо. З іншого боку, особливої прив'язки до IDE немає, CoIDE згадується лише як конкретний приклад, котру галочку в котрому меню слід поставити для досягнення якогось результату. Розгляд ведеться для ARM-GCC 4.8 та 4.9, для новіших чи старіших версій можуть бути відмінності.

Стандартна бібліотека C

субота, 7 листопада 2015 р.

CoIDE 2

Давненько я про CoIDE не писав. Воно потроху розвивався, виходили нові версії, фіксилися старі баги, вносилися нові. З'явилася підтримка STM32F3 -- тих, що в STM32F3Discovery, з'явилася, в значній мірі -- формальна (див. наступні пости) підтримка C++. Остання доступна версія - 1.7.8. Однак, попередні рік-два, не зважаючи на вихід згаданої 1.7.8, основні зусилля були зосереджені на новій версії, CoIDE-2. Перші його випуски видалися мені претензійним, але мало-юзабельним. Однак, минав час, випала нагода з ним знову попрацювати, і виявилося, що версія 2.0.3, все ще бета, але вже цілком придатна для повсякденної роботи. 

Так як і в самому CoIDE, і в CMSIS (*) з часу попередніх постів ("CooCox CoIDE [1.5.1]", "CoIDE 1.7.1"), багато що змінилося, вирішив написати знову. Спочатку планувався один пост, потім він переріс у цілу серію, але, як би там не було, серія ця запланована як незалежна від попередніх матеріалів, але абсолютної гарантії не дам -- у них може бути щось важливе, що я забув згадати тут. Буду вдячний за bug-report-и. :-)

(*) CMSIS -- "стандартна бібліотека" для ARM-івських контролерів, основу якої, для спільного у всіх них ядра, випускає ARM Inc, а кожен розробник конкретних мікроконтролерів доповнює підтримкою своїх "фіч" --- реалізованих ними периферійних засобів та можливостей, див [1], [2].

субота, 18 липня 2015 р.

Новини з Плутона (оновлюється)

Отож, новини із системи Плутона. 

Почнемо з того місця, де ми станцію залишили [на жаль, через технічні обмеження, це було досить давно]. Найкраще фото здалеку:
Останні навігаційні фото Плутона та Харона, 12 липня 2015, 08:45 і 08:50 UTC, відповідно, віддаль -- 2.5 млн км.
(c) NASA / JHUAPL / SwRI

На прес-конференції від наземної команди, разом із цією фото було опубліковано попередні наукові результати:

вівторок, 14 липня 2015 р.

Місія New Horizons

"New Horizons". (c) NASA
Плутон давно приваблює дослідників, особливо після того, як в 1989 Voyager-2 відвідав Нептун і Плутон залишився останньою планетою, де не бували земні роботи. Звичайно, первинним тут було не "колекціонування", а науковий (і трішки -- технічний) інтерес. Детальніше про останній -- див. "Плутон, до "New Horizons"", розділ "Фото".

Однак, дорога до нього була тернистою --- місії багато раз відміняли, навіть переможця, "наш" New Horizons, довелося відстоювати не раз. Детальніше на цій сторінці історії не зупинятимуся, за подробицями див. там же, посилання у виносці "(**)", а також вступ та історію на Вікі.

Тут зосередимося на тому, що це за Автоматична міжпланетна станція (АМС), що вона може і на які результати можна очікувати.

Спочатку --- про віддалі.  Станцію запущено в 2006 році, при запуску вона стала найшвидшим запущеним землянами об'єктом, по дорозі отримала "копняка" від Юпітера, тому змогла досягнути Плутона всього лиш за дев'ять з половиною років. А Плутон знаходиться всього лиш на внутрішній межі поясу Койпера

Тепер детальніше:

неділя, 12 липня 2015 р.

Ще один таємничий світ -- Плутон

Кращі, на момент публікації, фото. Подробиці - нижче.
(c) NASA / JHUAPL / SwRI
Є, все таки, щось магічне у тому, як нова земля вперше проявляється на горизонті. Вчетверте пишу про це в цьому блозі. Раніше була Веста, Церера, комета Чурюмова-Герасименко. А тепер -- Плутон. Як відомо, повз нього, через лічені десятки годин, 14 липня 2015 р, пролетить АМС New Horizons, вперше показавши його нам зблизька. Але вже зараз вона достатньо близько, щоб кожного дня постачати все більш якісні фото. І поки -- все більш загадкові.

субота, 11 липня 2015 р.

Плутон, до "New Horizons"

Пара фотографій, з допомогою яких було відкрито Плутон.
Взято із Wiki
Після багатьох десятиліть очікування(*), після чисельних перипетій(**), автоматична міжпланетна станція (АМС) землян, подолавши неймовірну віддаль(***), зовсім-зовсім скоро пролетить поруч із Плутоном -- ще одним загадковим світом нашої Сонячної системи. За мінімального везіння -- повністю перевернувши наше уявлення про нього. 

Про саму станцію, New Horizons, напишу трішки пізніше -- на жаль, недостача часу та втома і так відтягнули написання цього тексту до самого "далі нікуди". А зараз -- трішки про те, що ж ми знаємо про Плутон станом на першу половину 2015 року. 

Отож, Плутон, до-"Ново-Горизонтна" ера.

понеділок, 6 квітня 2015 р.

Мікро-оптимізація

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

Код, варіант 1:

double hamiltonian(const FK_GA_c::Individual & _indi)
{
    double sum = 0;
    for (unsigned i = 0; i < _indi.size(); i=i+2) {
        //i -- n_f,
        //i+1 -- n_d
        double n_f_i = _indi[i];
        double n_d_i = _indi[i+1];
        sum-=defparams.mu_f*n_f_i;
        sum-=defparams.mu_d*n_d_i;
        sum+=defparams.U*n_f_i*n_d_i;
        // 
        auto i_plus_1 = i+2; //i+1 в математичному сенсі --- наступний вузол
        // Циклічні граничні умови
        if(i_plus_1>=_indi.size()-1)
            i_plus_1=0;
        double n_f_i_1 = _indi[i_plus_1];
        double n_d_i_1 = _indi[i_plus_1+1];

        double base_hopping = (1-n_d_i)*n_d_i_1;
        double hopping=defparams.t1;
        hopping+=defparams.t2*(n_f_i+n_f_i_1);
        hopping+=defparams.t3*(n_f_i*n_f_i_1);

        hopping*=base_hopping;
        sum+=hopping;
    }
    return -sum;
} 
 
Це давня робоча версія, яка має ряд фундаментальних недоліків, але навряд чи мені буде охота повторювати весь цей цикл модифікацій, про які розповідатиму, заново -- треба зразу нормально писати :-), тому ілюструвати буду на ній. Сподіваюся, пробачите деякі вульгарності.