Does the controller have all the interfaces required ◦ Voltage range, cost, memory sizes(flash and ram) ◦ Familiarity with the architecture, supported software, documentation, even community ◦ debugger/programmer, toolchain ◦ Is some development kit available? If not, then can you make a pcb for prototyping yourself? Maybe someone has published a design using this online
C++ • compilers and chip makers often provides driver libraries and example code for things like USB, TCP/IP stack, and other peripherals • The reference manual is usually a reference for a family of similar chips, and the datasheet is the ultimate reference
boot • How do interrupts work in this chip • System clocks • Details about any peripherals you want to use like USB, SPI, serial, DMA, timers etc. Things to read in the manuals
running inside an operating system are hosted • Code running on a microcontroller, (and linux kernel) are compiled for a freestanding environment. You (or mostly the compiler) provides C ‘runtime’ • C startup = ◦ Initialize stack, cannot use variables without it (mostly), or call functions ◦ copy values to Initialized variables’ locations in RAM ◦ initialize globals to 0 ◦ Copy read only data like strings to RAM
defined way how a chip boots, might start executing from a particular location • Peripherals are memory mapped • Interrupt handlers, are locations reserved for function pointers in some • If you want a bootloader, then the application code must not have any portion located in flash occupied by bootloader • This is done using linker scripts • The C startup code used locations exported by the linker script to know where from/to copy or paste code
debugging can be difficult • File Systems, networking, graphics etc. These things may be done on some microcontrollers, but with a lot more effort than if using linux • application portability to a different system
◦ [Yocto project, openembedded, angstrom] ◦ [Buildroot, Openwrt] ◦ debian debootstrap ◦ Can use full featured distros too, like debian(without desktop environment) • Sometimes need to optimize for space/speed ◦ provide common tools using busybox ◦ simpler init, only necessary programs run on boot ◦ only required drivers in kernel ◦ compressed fs like squashfs Making a linux system for an embedded platform
execute a bootloader from ROM which loads another bootloader, or sometimes linux kernel itself • The bootloader loads the kernel, passes it kernel command line(can be hard coded in kernel image too) • after loading, it jumps to the kernel’s entry point • kernel command line option ‘rootfs’ is mounted
which becomes the first process, and all other processes spawn from it. • kernel loads modules as required • Usually init would be a standard program, like ◦ systemV init ◦ systemd(debian uses this) ◦ upstart(ubuntu) ◦ busybox provided sysV init(common in embedded systems to conserve space) • Init parses its init scripts to launch programs as required
card, network, USB hard disk • Choose linux platform which is most suitable ◦ Needs USB, ethernet, fast enough • Decide to use serial port to connect to a microcontroller, which connects to LCD and keypad • If only one USB port, put usb hub • Linux has drivers for serial(for this particular cpu), usb-storage(both hard disk and SD card), and usb CD ROM Example application
LCD on serial RX, sends keypad presses on serial TX • Choose python to write application • Can mount/unmount hard disk/SD card(usb mass storage) and cd-rom with mount/umount • can use eject to open tray • can write to serial port with say pyserial • can access network easily