„Slidy“ z mého workshopu na Installfestu. K dispozici i ve formě org-mode zdrojáku, jen je potřeba změnit příponu z .txt na .org.

About

  • ASCII by mělo být spíš UTF-8, ale to nezní tak „cool“ :-)
  • O mě
    • Pracuji na ČVUT, FEL
    • Embedded systémy (≈ low-level stuff)
    • Emacs používám od r. 1998
    • Patřím k lidem, kteří v Emacsu žijí
    • Vim používám také a nic proti němu nemám :-)

Org-mode

  • Pokud je Emacs označován jako operační systém, org-mode bychom mohli nazvat kancelářský balík
  • Outliner
    • Základní funkcionalita; snaha je, aby další funkce nekomplikovaly použití org-mode jako outlineru.
  • Značkovací jazyk (markup)
  • Prostředí pro přípravu textových dokumentů
  • Tabulkový kalkulátor
  • Kalendář, plánovač, organizér
  • a určitě mnoho dalšího…
  • Dokumentace: «C-h i d m org RET»
  • Nekonečné možnosti konfigurace
  • «M-x customize-group RET org RET»

Outliner

  • Nadpisy ^*+
    • M-RET – nový nadpis
    • M-šipky, M-S-šipky – změny úrovně či pořadí
    • C-c C-u – o úroveň výš, C-c C-j – skok, org#Motion
    • Schovávání: TAB, S-TAB
  • Seznamy
    • odrážkové, číslované, …
    • S-←,→
    • Mnohé klávesové zkratky stejné jako u nadpisů
  • Konverze «C-c *», «C-c -»

Značkovací jazyk (markup)

  • Tučné, kurzíva, podtrženo verbatim, přeskrtnuto, kód α,
  • Tabulky – nejsnadnější zadávaní jednoduchých tabulek do počítače | xxx | yyy «TAB»
  • Obrázky: [[./file.jpg]​]
  • Příklady, zdrojáky se zvýrazňováním syntaxe
    • Zkratky: <e «TAB», <s «TAB»
Příklad
print("String " + number)

Odkazy

  • [[cíl]​[popis]] nebo [​[cíl]]
  • Web Installfestu «C-c C-l», «C-c C-o»
  • Cíle odkazů
    • URL
    • ./soubor
    • interní odkaz [​[cíl]]
      • * Nadpis obsahující cíl
      • #+NAME: cíl

      3.3.1

    • Externí odkazy («C-c l»)
      • [[file:source.c::main(int]] argc
      • (tetris)
      • odkazy na emaily…
  • „Rádiové cíle“: <<<rádio>>> rádio

    Příklad: Rádio bylo vynalezeno roku 1893.

Organizace

  • Todo – každý nadpis může být položkou „TODO“ «S-←,→»
  • Seznam stavů je konfigurovatelný
  • «C-c a t» – all TODOs = agenda
  • Seznam souborů pro tvorbu agendy (např. jeden .org soubor pro projekt)
  • Scheduled/deadline: C-c C-s, C-c C-d
    • «.» = dnes, «S-šipky»
    • Rozumí i textu: např. „May 1“ nebo „Wed“
  • Záznam odpracovaného času na úkolech «C-c C-x C-i», «C-c C-x C-o»
  • Souhrn splnění podúkolů [/], [%]
  • [ ] Checkboxy «C-c C-c»
  • Tagy u nadpisů :tag:, «C-c C-c»
    • hledání podle tagů: «C-c a m»

Rychlý záznam TODO (capture)

  • Vyžaduje konfiguraci
    • Globální klávesa «C-c c»
    • Šablony - předvyplněný obsah, kam se má „TODO“ uložit
(setq org-capture-templates
 '(("t" "Todo" entry (file+headline "~/org/gtd.org" "Tasks")
        "* TODO %?\n  %i\n  %a")
   ("j" "Journal" entry (file+datetree "~/org/journal.org")
        "* %?\nEntered on %U\n  %i\n  %a")))

Export

  • «C-c C-e»
  • Plain text, HTML, OpenDocument, …
  • Relativně snadná tvorba vlastních exportů (např. Doxygen)
  • Nastavení exportu v hlavičce – «C-c C-e #»

Babel

  • Práce se zdrojovými kódy
    • Podpora více jazyků v jednom dokumentu a interakce mezi nimi
  • „Literate programming“
  • „Reproducible research“ (executable documentation)
for i in $(seq 3); do date; sleep 1; done
ls -l

Výsledky vidíme níže:

Wed  8 Mar 10:44:56 CET 2017
Wed  8 Mar 10:44:57 CET 2017
Wed  8 Mar 10:44:58 CET 2017
total 24
-rw-r--r-- 1 wsh wsh 6696 Mar  5 21:52 graph.png
-rw-r--r-- 1 wsh wsh 6232 Mar  8 10:42 index.org
-rw-r--r-- 1 wsh wsh 6232 Mar  8 10:44 org-mode.txt
  • Editace: «C-c ‘»
  • Spuštění: «C-c C-c»
  • Argumenty v hlavičce
    • :results verbatim drawer

Babel example

Run the benchmark (shell script) on a remote server:

mbw -a -q 10 | awk '{ print $1, $3, $9 }'

Gnuplot code to plot the results of the above command.

set key right bottom Left
set grid
set title "mbw results"
set xlabel "Attempt"
set ylabel "Bandwidth [MiB/s]"
set style data lp
set yrange [0:]
plot "< grep MEMCPY ".data  using 1:3 title "MEMCPY", \
     "< grep DUMB ".data    using 1:3 title "DUMB", \
     "< grep MCBLOCK ".data using 1:3 title "MCBLOCK"

graph.png

Properties

  • «C-c C-x p»
  • Key-value přiřazené k nadpisu
  • Může měnit různé nastavení pro danou sekci
  • Lze používat i jako jednoduchou databázi (hledání podle properties apod.)
  • Column view «C-c C-x C-c»
Posted Wed Mar 8 11:06:41 2017

I started using KiCad (version 4.0.1) for electronic design. It seems to be a great tool, but working with big connectors in schema editor is tedious. All connections have to be done manually and thus the process is error prone. Some way of automating the process would help. KiCad comes with scripting support, but unfortunately only in pcbnew. Eeschema seems not to have any support for automation yet. Hopefully, one can use xdotool under Linux to automate some boring tasks.

I wanted to attach the same labels to FMC connector pins as on the MicroZed FMC Carrier board – there is about 70 pins used. My initial state was this:

before.png

I copied the pin names and net labels from the original schmatic in PDF and put together the script bellow, which takes care of attaching the labels to the right pins. So after a few seconds I got the following:

after.png

The Python script that does the magic is here:

#!/usr/bin/env python3

import subprocess

conn = [
    ("LA06_P", "C10"),
    ("LA06_N", "C11"),
    ("LA10_P", "C14"),
    ("LA10_N", "C15"),
    ("LA14_P", "C18"),
    ("LA14_N", "C19"),
    ("LA18_CC_P", "C22"),
    ("LA18_CC_N", "C23"),
    ("LA27_P", "C26"),
    ("LA27_N", "C27"),

    ("LA01_CC_P", "D08"),
    ("LA01_CC_N", "D09"),
    ("LA05_P", "D11"),
    ("LA05_N", "D12"),
    ("LA09_P", "D14"),
    ("LA09_N", "D15"),
    ("LA13_P", "D17"),
    ("LA13_N", "D18"),
    ("LA17_CC_P", "D20"),
    ("LA17_CC_N", "D21"),
    ("LA23_P", "D23"),
    ("LA23_N", "D24"),
    ("LA26_P", "D26"),
    ("LA26_N", "D27"),

    ("CLK1_M2C_P", "G02"),
    ("CLK1_M2C_N", "G03"),
    ("LA00_CC_P", "G06"),
    ("LA00_CC_N", "G07"),
    ("LA03_P", "G09"),
    ("LA03_N", "G10"),
    ("LA08_P", "G12"),
    ("LA08_N", "G13"),
    ("LA12_P", "G15"),
    ("LA12_N", "G16"),
    ("LA16_P", "G18"),
    ("LA16_N", "G19"),
    ("LA20_P", "G21"),
    ("LA20_N", "G22"),
    ("LA22_P", "G24"),
    ("LA22_N", "G25"),
    ("LA25_P", "G27"),
    ("LA25_N", "G28"),
    ("LA29_P", "G30"),
    ("LA29_N", "G31"),
    ("LA31_P", "G33"),
    ("LA31_N", "G34"),
    ("LA33_P", "G36"),
    ("LA33_N", "G37"),

    ("CLK0_M2C_P", "H04"),
    ("CLK0_M2C_N", "H05"),
    ("LA02_P", "H07"),
    ("LA02_N", "H08"),
    ("LA04_P", "H10"),
    ("LA04_N", "H11"),
    ("LA07_P", "H13"),
    ("LA07_N", "H14"),
    ("LA11_P", "H16"),
    ("LA11_N", "H17"),
    ("LA15_P", "H19"),
    ("LA15_N", "H20"),
    ("LA19_P", "H22"),
    ("LA19_N", "H23"),
    ("LA21_P", "H25"),
    ("LA21_N", "H26"),
    ("LA24_P", "H28"),
    ("LA24_N", "H29"),
    ("LA28_P", "H31"),
    ("LA28_N", "H32"),
    ("LA30_P", "H34"),
    ("LA30_N", "H35"),
    ("LA32_P", "H37"),
    ("LA32_N", "H38"),
]

subprocess.call(["xdotool", "search", "--name", "/FMC/", "windowfocus"])
xtab = str.maketrans({"_": "underscore"})
for net in conn:
    label = [char.translate(xtab) for char in net[0]]
    pin = [char.translate(xtab) for char in net[1]]
    subprocess.call(["xdotool", "key", "--delay", "50", "ctrl+f"] + pin + ["Return", "Escape", "Down", "Left", "Left", "Left", "w",
                     "Left", "Left", "Left", "Left", "Left", "Left", "Left", "Left",
                     "Left", "Left", "k", "l"] + label + [ "Return", "Return"])
Posted Sun Jan 10 15:03:28 2016

Osnova, podle které jsem jel na dnešním workshopu na Installfestu.

1 Co je Emacs?

  • Všestranný textový editor
  • Interpret Lispu (v jazyce C) + spousta Lispového kódu
    • C: 280 kLoC (20%), Lisp: 1 MLoC (80%)
    • Srovnání – Firefox: 6 MLoC C/C++, 3.6 MLoC JavaScript+HTML
  • Emacs = Editor MACroS nebo Esc-Meta-Alt-Ctrl-Shift :)
  • Plnohodnotný operační systém :) (M-x tetris, M-x doctor)
  • Začal vznikat v 70. letech

emacs_learning_curves.png

2 Terminologie

  • Poplatná době vzniku
  • Buffer = otevřený soubor
  • Okno (window) = část obrazovky editoru zobrazující buffer
    • Jedno okno zobrazuje právě jeden buffer
    • Jeden buffer může být zobrazován nula až N okny
  • Frame = to čemu dneska říkáme okno
    • Může být grafický nebo textový (terminál)

3 Základní klávesové zkratky

  • Mnoho jich je stejných jako v bashi
  • Dobře se používají i na exotických klávesnicích (kámošův notebook, BT klávesnice k mobilu/tabletu, …)
  • Notace: C = Control, M = Meta = Alt = Esc, S = Shift

3.1 Kurzor

  • C-b = backward char, C-f = forward char, C-p = prev line, C-n = next line
  • M-b = backward word, M-f = forward word, M-p = prev ???, M-n = next ???
  • C-a = home, C-e = end
  • M-a = backward sentence, M-e = forward sentence

3.2 Mazání

  • C-d = znak, M-d = slovo
  • C-k = do konce řádky

3.3 Příkazy

  • C-x C-f = find (open) file
  • C-x C-s = save file
  • C-x C-c = “exit”
  • C-x u, C-_, C-/ = undo

Pozn.: C-x je tzv. prefixová klávesa, podobně jako Esc

  • C-l = redisplay, center, …
  • C-g = přeruší právě vykonávanou operaci (mačkat, když Emacs nereaguj)

3.4 Hledání

  • C-s = interactive search, C-M-s = interactive regexp search
  • C-r = reverse search

3.5 Prefix/numeric argument

  • Neplést s prefixovou klávesou
  • Mnohým příkazům (klávesovým zkratkám) lze předat číselný parametr
  • Většinou to znamená opakování
  • C-u 8 C-f – posun o 8 znaků doprava
  • M-8 C-f – to samé
  • C-u samotné modifikuje některé příkazy i bez čísla (C-u C-x C-c = vše ulož a “exit”)

4 Příkazová řádka

  • M-x <příkaz>
  • Mini-buffer – většina klávesových zkratek stejná jako při editaci normálních bufferů (souborů)
  • tab-completion
  • completion “modes”
  • Příkaz je lispovská funkce označená jako (interactive).
  • Klávesové zkratky spouští příkazy – viz (global-set-key ...).

5 Velké (major) a malé (minor) módy

  • V Emacsu se vše motá kolem “módů”
  • Velký mód:
    • definuje zvýrazňování syntaxe,
    • definuje klávesové zkratky,
    • implementuje (automatické) zarovnávání kódu,
    • vybírá se automaticky podle přípony nebo obsahu souboru,
    • lze ho vybrat i manuálně (spuštěním příkazu *-mode; např. c-mode).
  • Malý mód:
    • Implementuje dodatečnou funkcionalitu, kterou má smysl používat s vícero velkými módy.
    • Příklady:
      • flyspell-mode
      • auto-fill-mode
      • hide-show-mode
  • Jaké módy jsou momentálně aktivní naznačuje Mode line.

6 Přístup k nápovědě

  • Emacs má poměrně dobrý systém nápovědy.
  • C-h prefix key
    • C-h f – funkce
    • C-h v – proměnné
    • C-h k – klávesová zkratka
    • C-h m – mód
    • C-h i – prohlížeč info stránek (C-h i m Emacs <RET>)
      • Navigace: ‘n’, ‘p’, ‘[‘, ‘]’
      • ‘i’ – hledání v rejstříku (pak ‘,’)
  • M-x man

7 Bloky (region, rectangle)

  • Nové verze Emacsu (konečně) podporují výběr pomocí S-<šipky>.
  • Tradičně: blok je oblast od “značky” ke kurzoru (point).
  • C-SPC = polož značku
  • Ctrl-C, Ctrl-V, Ctrl-X – standardně nefunguje, lze zapnout M-x cua-mode.
    • Ctrl-C koliduje s mnoha standardními zkratkami; cua-mode to částečně řeší.
  • Tradičně:
    • Smazaný text se ukládá do “kill ringu” (např. C-k, M-d)
    • C-y (yank) vloží hodnotu z konce “kill ringu”
    • M-y (následující po C-y) vkládá starší hodnoty z “kill ringu”.
    • C-w = kill region
    • M-w = “copy” region
  • Obdélníkové bloky
    • C-x r * – neintuitivní (aspoň pro mne)
    • C-x SPC = rectangle mark mode
      • M-x string-insert-rectangle – vloží stejný text na každou řádku bloku
    • CUA mode: C-RET = cua-set-rectangle-mark
      • string-insert-rectangle není potřeba; stačí začít psát
      • ve výjimečných případech se chová podivně

8 Správa oken a bufferů

  • Správa oken
    • není ideální
    • C-x 2, C-x 3 = rozděl okno vertikálně/horizontálně
    • C-x o = přesun na následující okno
    • Windmove package – pohyb mezi okny podle směru (např. S-<šipky>)
    • C-x 0 = smaž aktuální okno (ale ne buffer)
    • C-x 1 = smaž ostatní okna
  • Přepínání bufferů
    • C-x <left>/<right>
    • C-x b = zadat název bufferu (použitelné s completion módy)
    • C-x C-b (polo) interaktivní výběr bufferu
    • M-x ibuffer = interaktivní výběr bufferu
    • M-x helm-buffer-list = dtto

9 Užitečné příkazy/klávesové zkratky

  • M-q = přeformátování odstavce (v mnoha módech inteligentní)
  • C-s = interactive search, C-M-s = interactive regexp search
    • V příkazové řádce hledání:
      • C-s – minulé hledání
      • C-w – doplní slovo pod kurzorem
      • M-c – přepne rozlišování malých a velkých písmen
      • M-e – editace (např. minulého hledání po C-s C-s)
  • M-% = nahrazení řetězce
  • C-M-S-% = nahrazení regulárního výrazu
  • M-/ = doplň rozepsané slovo podle předchozích slov
  • Macros: F3 = začátek nahrávání, F4 = konec nahrávání/spuštění
  • Nahrazení textu ve víc souborech najednou: M-x dired-mode, mark (m), Q
  • M-x occur
  • M-x rgrep
  • M-; comment-dwim (do what I mean)
  • C-M-a = beginning-of-defun, C-M-e = end-of-defun
  • C-M-p, C-M-n, C-M-u = pohyb po závorkami ohraničených blocích (prev, next, up)
  • C-u C-SPC – návrat na místa předchozí editace

10 Konfigurace, “Customization”

  • Možnosti konfigurace jsou nekonečné
  • Předkonfigurovaný Emacs: Emacs Prelude
  • Standardní konfigurační soubor ~/.emacs nebo ~/.emacs.d/init.el.
    • Nastavování proměnných
    • Konfigurace klávesových zkratek (global-set-key (kbd "C-c w") 'toggle-truncate-lines)
    • Definice vlastních příkazů
    • Zapínání minor módu
  • Customization
    • User Hacker-friendly konfigurace
    • +GUI+TUI pro konfiguraci skoro všeho
    • M-x customize
    • M-x customize-{variable,face,group}
    • Není potřeba ručně editovat ~/.emacs

11 File/directory-local variables

  • Konfiguraci Emacsu lze ukládat i do editovaných souborů.
  • Podobně je možné konfiguraci uložit do souboru .dir-locals.el a pak bude platit pro všechny soubory v daném adresáři a jeho podadresářích.
  • M-x add-file-local-variable
  • M-x add-dir-local-variable
/* Local Variables: */
/* compile-command: "make CFLAGS='-g -O0 -Wall" */
/* End: */

12 Programování

  • Odsazování
    • většinou automatické, nebo po <TAB>
    • inteligentní zarovnávání všeho
      • ‘M-q’ v komentáři zarovná komentář
  • Kompilace
    • M-x compile, M-x recompile
    • M-x next-error (skáče na chyby, detekce mnoha kompilátorů/formátů chybových hlášení)
  • Doplňování kódu
    • auto-complete-mode
    • company-mode (asi lepší)
    • yasnippet (TextMate snippets in Emacs)
  • Často možnost interakce s interpretrem skriptovacích jazyků (např. v M-x python-shell-send-defun)
  • Verzovací systémy
    • vc – stejné klávesové zkratky pro všechny VCS (např. C-x v = – diff aktuálního souboru)
    • magit – speciální mód pro práci s gitem

13 Užitečné módy

  • auctex – pokročilý editor na *TeXové dokumenty
    • navigace po sekcích, promote/demote sekcí
    • integrace s BibTeXem pro snadné hledání/vkládání citací
    • náhledy rovnic a obrázků přímo v editovaném textu
  • org-mode – tvorba a organizování poznámek, TODO seznamů, plánování projektu, tvorba dokumentů atd.
    • tato prezentace je v org módu
  • dired-mode – správa souborů
    • C-x d, C-x C-f (adresář)
    • mazání souborů: označit ‘d’, smazat ‘x’
  • TRAMP
    • vzdálená editace (kompilace, …) souborů
    • SSH, sudo, …
  • notmuch – lokální “gmail” (rychlé vyhledávání), GUI v Emacsu
  • shell, eshell – práce s příkazovou řádkou bez opuštění Emacsu

Instalace balíků třetích stran:

  • M-x list-packages
  • MELPA repozitář balíků

14 emacsclient

  • Emacs většinou dlouho startuje
  • Doba startu záleží na uživatelské konfiguraci
    • Inicializace balíků při startu vs. autoload
  • Emacs lze pustit jako “server” (emacs --daemon) a připojovat se k němu pomocí programu emacsclient.
    • Nic se nemusí konfigurovat, emacsclient si spustí emacs sám:
      #!/bin/sh
      exec emacsclient -a '' "$@"
      
  • K jednomu serveru se lze připojit současně z různých terminálů (lokálně X-windows, vzdáleně přes SSH).

15 Úvod do Emacs Lispu

  • (Emacs) Lisp
    • C-h i m Elisp <RET>
    • Je jednodušší než např. Common Lisp
    • Program i data vypadají stejně (S-výrazy/S-expressions/sexp)
    • Vyhodnocení výrazu:
      • číslo je číslo, řetězec je řetězec
      • seznam: první prvek udává jméno funkce, ostatní prvky jsou parametry.
        (message "Ahoj")
        (message (concat "Ahoj" "Installfest"))
        
    • Proměnné:
      • globální:
        (defvar xyz 0)
        
      • lokální:
        (let (a b)
          <kód>)
        
    • Funkce:
      (defun fs-czech ()
        "Starts flyspell with czech dictionary"
        (interactive) ; Způsobí, že fs-czech se dá spustit pomocí M-x
        (flyspell-mode)
        (ispell-change-dictionary "czech")
        (flyspell-buffer))
      

16 Příklad použití elispu

  • Navigace po framech v LaTeX beameru
    (defconst latex-beamer-frame-re         ; Regulární výraz, který budeme hledat
      "\\\\\\(frametitle\\|section\\){")    ; '\' se musí 2x escapovat
    
    (defun is-outside-of-comment ()
      (null (nth 8 (syntax-ppss))))
    
    (defun latex-beamer-previous-frame ()
      (interactive)
      (while (progn
               (re-search-backward latex-beamer-frame-re)
               (not (is-outside-of-comment))))
      (recenter 0))
    
    (defun latex-beamer-next-frame ()
      (interactive)
      (when (looking-at-p latex-beamer-frame-re)
        (forward-char))
      (while (progn
               (re-search-forward latex-beamer-frame-re)
               (not (is-outside-of-comment))))
      (goto-char (match-beginning 0))
      (recenter 0))
    
    (add-hook 'LaTeX-mode-hook (lambda ()
      (local-set-key (kbd "M-p") 'latex-beamer-previous-frame)
      (local-set-key (kbd "M-n") 'latex-beamer-next-frame)))
    

17 In-line elisp

  • C-x C-e = vyhodnoť výraz před kurzorem (point)
  • Kusy elispu lze vkládat do komentářů programů v jiných jazycích a spouštět přímo tam.
\chapter*{List of Acronyms}

% Sort acronyms: (let ((sort-fold-case t)) (sort-regexp-fields nil "^[[:space:]]*\\\\acro\{\\([^}]*\\)\}.*$" "\\1" (search-forward "\\begin{acronym}") (search-forward "\\end{acronym}")))
\begin{acronym}[XXXXX]
  \acro{AC}{Access Category}
  \acro{ACK}{Acknowledge}
  \acro{BFQ}{Budget Fair Queuing}
\end{acronym}
Posted Sun Mar 8 17:10:35 2015 Tags:

Stejně jako vloni jsem měl i letos přednášku na InstallFestu. Tentokrát to bylo o nástroji novaboot, který už přes dva roky vyvíjím a používám jej k mnoha zajímavým věcem. Některé z nich jsem během přednášky zmínil a najdete je ve slidech.

Při přednášce se dostavil klasický “demo efekt”, tedy že to, co ještě ráno fungovalo, fungovat přestalo. Nemohl za to novaboot, ale pochybná implementace technologie Intel AMT na mém počítači. Naštěstí jsem měl ještě jeden počítač, se kterým novaboot fungoval, ale bohužel jsem na něj neměl otočenou web kameru, takže se návštěvníci museli spokojit jen s výstupem na mém terminálu.

Slidy k přednášce:
Slidy k přednášce
Posted Tue Mar 4 09:47:30 2014 Tags:

I use Matlab/Simulink R2012b under Linux to model dynamic systems. In order to perform hardware-in-the-loop testing, I want to run my models in real-time on Linux with rt_preempt patch. Running a Simulink model in real-time can be achieved by converting the model to the C code, compiling it and running the resulting application. Simulink supports this by means of Simulink Coder. Producing a Linux application with Simulink Coder is not as straightforward as one might think, though.

About Simulink Coder

Simulink Coder (formerly called Real-Time Workshop) can generate the code in many styles and for several platforms and operating systems. Surprisingly, Linux is also among supported environments.

Simulink Coder can, by default, generate code for so called Generic Real-Time Target (GRT). Such code should be suitable for running on desktop platforms. If you want to run the code on a more constrained embedded system or you have additional requirements on the code (e.g. compliance with safety standards), there is Embedded Coder for you. Embedded Coder extends Simulink Coder with additional capabilities and targets. The default Embedded Coder target is called Embedded Real-Time Target (ERT).

As it turns out, neither GRT nor ERT target alone can be used to create Linux executable even if documentation says the opposite.

Available options for generating Linux applications

From the documentation it seems that there are several options available out of the box that allow to generate Linux applications from Simulink. They are:

  1. The use of Embedded Real-Time target (ert.tlc) and selecting NativeThreadExample as the target operating system in Model Configuration → Code Generation → Templates.

    When I tried to generate the code, I got this error:

    This model specifies the ‘Target operating system’ as ‘NativeThreadsExample’ from the ‘Template’ section of the ‘Code Generation’ pane of the Configuration parameters dialog. This example target is currently supported only when the model is configured for concurrent execution.

    After some searching, I figured out how to enable concurrent execution. It can be done at View → Model Explorer → right click on Configuration → Show Concurrent Execution options and then check Allow tasks to execute concurrently on target. Even though I enabled this and configure the tasks, I still got the same error.

  2. The second option might be using the IDE Link Target that allows to compile the generated code by Eclipse IDE. Even though I don’t like Eclipse, I tried to set it up according to the documentation. Again no success. I ended up with some strange errors suggesting that there is a problem with Eclipse (more precisely its JVM) being a 32 bit application and Matlab a 64 bit application. My guess is that this feature is tested only on Windows. Since Matlab R2012b is not distributed for 32 bit Linux, it is not possible to test this option with 32 bit Matlab. Furthermore, in release notes of R2013a it is announced that Eclipse support will be dropped in future releases.

Custom target for Linux applications

Simple target

Since I failed with both above options I decided to write a custom code generation target for Linux. One option would be to use a target previously developed at our department, but it has several drawbacks:

  1. The generated code cannot be compiled. It seems that the interface to the generated code changed between Simulink version from 2007 (when the target was developed) and R2012b used by me.
  2. I don’t like that the target is meant to be used on Windows (hardcoded backslashes etc.) and additionally,
  3. it contains features that I do not need (CANOpen block set).

Therefore I decided to write my own target that should be as simple as possible.

After creating the target by copying the ert.tlc file and modifying it slightly (basically replacing ert with ert_linux) and selecting NativeThreadsExample as in the step 1 above, the code was successfully generated. You can see this target here. Such a target has two problems:

  1. It does not support external mode, i.e. a mode in which Simulink can connect to the running application to provide on-line parameter tuning and real-time data plotting.
  2. The generated code uses POSIX timers that use signals to wake up the threads. Signals have quite big overhead and there are rumors that their delivery can suffer from priority inversion.

The only way to get Linux application with support for external mode seemed to develop a target with custom main.c file.

Advanced target

I developed the target that provides the main.c file (actually called ert_main.c) and supports external mode. Although the documentation is quite extensive (several thousands pages in total), if was really hard to figure out how to do it properly. Several times it was necessary to study awful TLC1 source code which is, IMHO, very badly structured. Fortunately, I could use Lukáš Hamáček’s target as an example, which helped me a lot.

The result of my work is can be downloaded from our repository. The target has the following features:

  • Support for external mode over TCP.
  • Support for both single-rate and multi-rate systems.
  • Simulation threads are scheduled as SCHED_FIFO (real-time priority).
  • External mode communication runs in non-real-time thread.

I tested the target on several systems and everything seemed to work as expected. My only concern now is about thread safety. Given that Simulink produces the error messages about concurrent execution of threads (see above), I’m not sure whether the generated code can be safely run in multiple threads. Also the code implementing external mode server contains several semaphores but only when it is compiled for the VxWorks OS. I’ll probably check this later if we encounter any problems that might be caused by the code not being thread safe.

Conclusion

It is surprising how few relevant results Google gives when one asks for “simulink real-time workshop linux”. It seems that the Embedded Coder target for Linux described in this post might be useful for people waning to run their Simulink models on Linux. Although that the target may not work perfectly and in all configurations, I think it is now good enough for interested people to try. If you experience any problems with the target, let me know.

Footnotes:

1

Target Language Compiler – the tool used to convert Simulink blocks to C code.

Posted Thu Jul 25 17:36:07 2013 Tags:

Na letošním InstallFestu jsem měl přednášku o použití Linuxu v robotech. Snažil jsem se ukázat, jak lze z Linuxu běžícím na nějaké “embedded” desce ovládat hardware k ní připojený. Všechny praktické ukázky, které jsem měl připravené, se povedly, až na tu poslední – robot v akci. Ale tu jsem nahradil videem z finále Eurobotu 2010.

Slidy k přednášce:
Slidy k přednášce

Update: Video záznam z přednášky je k dispozici na stránkách InstallFestu.

Posted Mon Mar 4 12:25:29 2013 Tags:

I have an ikiwiki-based website that is used for a university course. Every student has a page where she is supposed to provide information about a project being worked on. For this I want to authenticate students so that they can only edit their page. So far the authentication was implemented with unixauth plugin and the server used PAM modules to authenticate against LDAP server. This worked sufficiently well, however, this method was deprecated by our university IT. Instead, they want all web applications to use Shibboleth technology. I was surprised how easy it is to make ikiwiki work with Shibboleth.

Shibboleth project distributes Apache module modshib2 (libapache2-mod-shib2 package under Debian) that, when properly configured, does the whole authentication for you. Its configuration is not particularly easy but, with the documentation from our IT department, it was possible to do it. When everything is configured, the identity of the authenticated user is passed to the web application in REMOTE_USER environment variable (and a few other variables may contain additional attributes). The use of REMOTE_USER means that one can use the httpauth plugin and Shibboleth authentication works out of the box.

It is sufficient to follow httpauth documentation and add this configuration to your Apache server.

<Directory /var/www/osp/auth>
    Options +ExecCGI -Indexes

    AuthType shibboleth
    ShibRequestSetting requireSession 1
    Require valid-user

    <Files ikiwiki.cgi>
        SetHandler cgi-script
    </Files>
</Directory>

That’s all.

Posted Thu Jan 31 13:59:19 2013 Tags:

Last week I presented a paper at 14th Real-Time Linux Workshop. The topic was the comparison of operating system noise between Linux and NOVA microkernel. It was a joint work of myself and Stefan Wächtler from TU Dresden. If you are interested I published the paper as well as all source data here.

Posted Tue Oct 30 10:54:34 2012

This is mostly a bugfix release. The last version was released almost four years ago so it is definitely time for a new release. One big change since the last release is that ORTE is no longer distributed as a part of OCERA project. We created a new project at sourceforge specifically for ORTE. With this change we also moved the source repository from CVS to Git and created a new homepage.

This release does not contain Windows binaries. If you have trouble compiling them from sources, let us know.

About ORTE

ORTE is an open source implementation of Real-Time Publish-Subscribe (RTPS) communication protocol. RTPS is new application layer protocol targeted to real-time communication area, which is build on the top of standard UDP stack. Since there are many TCP/IP stack implementations under many operating systems and RTPS protocol does not have any other special HW/SW requirements, it should be easily ported to many HW/SW target platforms. Because it uses only UDP protocol, it retains control of timing and reliability.

ORTE homepage: http://orte.sf.net/

Posted Thu Aug 16 11:42:41 2012 Tags:

At our university, we bought a PC that was intended for testing during development of low-level components in operating systems (drivers, kernels, etc.). In such tests it is common that the machine gets stuck because of various bugs and it is necessary to perform hard reset to recover from such situations. To our surprise the machine we ordered had neither a reset button on the case nor any connector on the motherboard where the button could be connected. It was a Dell machine.

Moreover, we want to share this PC between multiple people and be able to run some tests automatically. Therefore we wanted to use a remotely controllable relay and serial port to reset the box remotely. I thought that we were lost without the reset button until a colleague of mine brought my attention to PWR_OK signal of ATX motherboards. Using this signal, it is possible to initiate the reset of the motherboard, but things were not so simple as they initially seemed to be.

Power supply uses PWR_OK signal to inform the motherboard that the voltage it generates is stable. When the signal goes low, the motherboard should go to the reset state and remain there until PWR_OK goes up again. So the plan was simple. Use the relay to control the PWR_OK signal and it allows us to reset the motherboard. The problem with this approach was that the motherboard was reset but it also caused the power supply to switch off for about one second and we wanted to avoid frequent switching off and on. The reason for this switching off was that upon detecting low level on PWR_OK, the motherboard responds with deasserting PS_ON signal which causes the power supply to switch off. Therefore, to reset only the motherboard, we had to keep the PS_ON asserted, while playing with PWR_ON. Finally, we ended up with this schematics:

schema.png

You can see that the PS_ON signal is always tied to ground. This makes the power supply always switched on. We can afford this because we use RELAY1 to switch on/off the computer. The second relay controls PWR_OK signal. In the default position, PWR_OK signal connects the power qsupply with the motherboard as it normally do. When the relay switches, PWR_OK on motherboard side is tied to GND and motherboard gets reset.

The final solution now looks like this:

iprelay.jpg

After doing all of this, I’ve found that you can buy a simple adapter, which allows you to do the same without cutting the wires of the power supply.

Posted Fri Aug 3 18:36:59 2012