2011/02/12

Algorytmy wielodostepu bez blokowania

Często podczas tworzenia oprogramowania z wykorzystaniem wątków musimy zadbać o wielodostęp do sekcji danych lub kodu. Najprostszym sposobem jest zabezpieczenie z wykorzystaniem semafora lub mutex'a. jednak takie podejście ma podstawowy problem, tworzy wąskie gardło dla przetwarzania współbieżnego. Problem ten jest bardzo poważny w systemach z duża liczba procesorów gdzie wymagana jest duża skalowalność. W przypadku systemów RTOS dochodzi dodatkowo problem nieprzewidywalności czasu wykonania, co jest głównym powodem problemów w takich systemach.

Rozwiązaniem jest szereg algorytmów które realizują założone zadanie (umożliwiają wielodostęp) ale nie wymagają blokowania. Bardzo dobre opracowanie znajdziecie tutaj

http://www.makelinux.net/ldd3/chp-5-sect-7.shtml

Sterowanie silnikiem krokowym

Fajny artykuł o sterowaniu silnikami krokowymi.

http://www.codeproject.com/KB/system/MotorController.aspx

Design patterns

Polecam strone m.in. o design patterns, bardzo dobrze przygotowany materiał.

http://sourcemaking.com/

2011/01/31

ARM w SIM

Szukałem informacji na temat Cortex-M0 a tym czasem trafiłem na coś takiego:

Jak się okazuje można opchnąć 320KB flash i Cortexa-M3 w karcie SIM!!! Ciekawe czy zwykły zjadacz chleba może sobie kupić parę sztuk tych czipów. Już widzę urządzenia do podpisu cyfrowego Made In Home :D, lub inteligentne karty SIM do GSM. Ehhh ... gdyby tylko wróciły stare czasy wyciągania kluczy z SIM :)

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/CD00252313.pdf

2011/01/30

Skróty klawiaturowe konsoli

Nie wiem czy znacie następujące skróty klawiaturowe konsoli:

!!
Powtórzenie ostatniego polecenia
!foo
Powtórzenie polecenia zaczynającego się od ‘foo…’ (np. !ps, !mysqladmin)
Ctrl-a
Skocz na początek linii
Ctrl-e
Skocz na koniec linii
Ctrl-l
Wyczyść ekran
Ctrl-r
Wyszukaj polecenie w historii (szukanie wstecz). Jeżeli chcemy edytować polecenie - wciskamy strzałkę w prawo
Alt-?
Podpowiedzi uzupełnienia komend
Ctrl-k
Wytnij tekst do końca linii
Ctrl-u
Wytnij tekst ad początku linii do kursora
Ctrl-y
Wklej wycięty tekst

ARM w pigułce

Kto chce się szybko i w skrócie zapoznać z asemblerem i kodem startowym dla ARM polecam:
http://www.bravegnu.org/gnu-eprog/index.html

Dla mnie najciekawsze było streszczenie architektury rozkazów ARM:
http://www.bravegnu.org/gnu-eprog/arm-iset.html


Do tego polecam
http://www.stm32.eu/index.php?option=com_content&view=category&layout=blog&id=35&Itemid=57

2010/12/22

Niewinne static

Czym różną się zmienne globalne oznaczone jako static:
- ich definicja nie jest dołączana do tablicy exportu
- są inicjalizowane tylko raz (podczas uruchomienia kodu startowego, domyślnie 0 (sekcja bss) lub wartością podana przy deklaracji (sekcja .data))

O ile pierwsza właściwość jest mało inwazyjna to druga ma pewne konsekwencje jeśli o niej zapomnimy.
Gdybyśmy np chcieli pisać pseudo obiektowo wykorzystując czyste C, i zapomnieli o konstruktorze statycznym a uprościli sprawę inicjalizujac zmienne współdzielone w miejscu deklaracji.

Np załóżmy ze mamy do napisania prosta klasę która ma jedna zmienna współdzielona przez wszystkie instancje oraz funkcje Create, Destroy i DoSome.

static int mod_state_variable = 10; //dla uproszczenia pomijam mutexy
typedef struct Mod_Tag
{
      int some_var;
} Mod_T;

void Mod_Creat(Mod_T *mod)
{

    mod->some_var = 0;
}

void Mod_Destroy(Mod_T *mod)
{
}

void Mod_DoSome(Mod_T *mod)
{
   if( 10 == mod_state_variable )
       mod_state_variable = 50;
   mod_state_variable++;
   mod->some_var++;
}

sekwencja
Mod_Init();
Mod_DoSome();
Mod_DoSome();
Mod_Finalize();

da wynik
mod_state_variable = 51 mod->some_var = 1 po pierwszym DoSome
mod_state_variable = 52 mod->some_var = 2 po drugim DoSome

powtórzenie sekwencji
Mod_Init();
Mod_DoSome();
Mod_DoSome();
Mod_Finalize();

da nam
mod_state_variable = 53 mod->some_var = 1 po pierwszym DoSome
mod_state_variable = 54 mod->some_var = 2 po drugim DoSome

ponieważ zmienna statyczna mod_state_variable inicjalizowana jest tylko raz.
Jeśli chcemy przywrócić pierwotny stan zmiennej współdzielonej musieli byśmy użyć coś na wzór konstruktora statycznego.

Podobnie, inicjalizacja w miejscu deklaracji nie spełni swojego zadania np w przypadku bibliotek dynamicznych które posiadają tak inicjalizowane zmienne statyczne. Dopiero odłączenie biblioteki i ponowne jej podłączenie spowoduje przeinicjalizowanie takich zmiennych.