This project served as the principal assignment for ECE 18-349: Introduction to Embedded Systems and had the goal of integrating and extending knowledge from prior assignments to support running code on a bare metal Raspberry Pi.
Prior labs involved creating serial I/O drives, timers, interrupts, and system calls. The purpose of this project was to extend these to create a scheduler and a mutex interface to form a kernel that would be run on a Raspberry Pi's Broadcom BCM2836 processor. The scheduler was implemented using a rate-monotonic algorithm that supported multiple tasks and the mutex interface was implemented using a highest locker's priority protocol to eliminate any possibility of deadlock.
Given that this project offered much autonomy and lots of open-ended design choices, it was significantly more enjoyable than previous assignments that just involved gluing together various functions from data sheets. Being able to come up with a large scale implementation idea, coding that, and running and debugging the cases to find that the idea actually worked was so much more satisfying than other cut and dry assignments. I actually wish I had more time to be able to further refine my ideas and code to further increase functionality, as not every idea was able to be implemented and tested in time. Unfortunately, I had to return the board the code was run on so it doesn't look like that's going to happen any time soon.