This repo contains projects, updates code, notes, fixes and results for the book "Hands-On RTOS with Microcontrollers" by Brian Amos and published by Packt.
Date: March, 2024.
- The SystemView Recordings .SVDat and Image Outputs are available.
This microcontrollers book starts by introducing you to the concept of RTOS and compares some other alternative methods for achieving real-time performance. Once you've understood the fundamentals, such as tasks, queues, mutexes, and semaphores, you'll learn what to look for when selecting a microcontroller and development environment. By working through examples that use an STM32F7 Nucleo board, the STM32CubeIDE, and SEGGER debug tools, including SEGGER J-Link, Ozone, and SystemView, you'll gain an understanding of preemptive scheduling policies and task communication. The book will then help you develop highly efficient low-level drivers and analyze their real-time performance and CPU utilization.
STM32 Nucleo-F767ZI Development Board - Board used in this course.
Eclipse-based STM32CubeIDE - C/C++ development platform with peripheral configuration, code generation, code compilation, and debug features for STM32 microcontrollers and microprocessors. Works on Windows/Linux/Mac and is free.
SEGGER SystemView - Real-time recording and visualization tool for embedded systems. It reveals the true runtime behavior of an application, going far deeper than the system insights provided by debuggers. This is particularly effective when developing and working with complex embedded systems comprising multiple threads and interrupts. Works on Windows/Linux/Mac and is free.
SEGGER Ozone - Full-featured graphical debugger for embedded applications. It is possible to debug any embedded application on C/C++ source and assembly level, as well as loading applications built with any tool chain / IDE or debug the target's resident application without any source. Ozone includes all well-known debug controls and information windows and makes use of the best performance of J-Link and J-Trace debug probes. Works on Windows/Linux/Mac and is free. \
As with any other software engineering book, it is inevitably to find few specific errors like software tools that were used at the moment of publishing that are no longer supported, or some coding bugs that can be improved in order to get the expected output.
Shout out to Jim Yuill who took the lead on this and in 2022 decided to document with detail these findings in his website An Unofficial Study-Guide for the Book: Hands-On RTOS with Microcontrollers. Whenever I reached an area of confussion or where I thought could be an error, his study guide had the bugs found and fixes that needed to be applied to the source code or the configuration files to run the exercises as expected.
You can find the GitHub Issue where they share and comment some of this bugs with the author.
Here is his GitHub Repo with some of the fixes he applied, and from where I based to continue fixing and improving more the the source code and configuration files.
You can find here the most important fixes that need to be applied for running /debugging the applications the most simple way. For full details and alternatives please refere to the links above in the Notes section.
-
After building the project and source files with STM32Cube IDE, we need to make use of the .jdebug files provided by the author in order to be capable or flashing the board with Ozone as well as for debugging. However the author left some lines of codes that doesn't have the right attribute/settings or that contain paths making reference to IDE tools no longer available that need to be replaced.
-
The line of code with
Project.SetTargetIF ("JTAG");
needs to be changed forProject.SetTargetIF ("SWD");
. -
For the AddSvdFile settings, the author used an IDE that is not used in the book, instead we use STM32CubeIDE and thus the .svd file for the STM32F767 microcontroller is found in other path. Replace
Project.AddSvdFile ("C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.3.0\ide\plugins\com.atollic.truestudio.tsp.stm32_1.0.0.20190212-0734\tsp\sfr\STM32F7x7.svd");
with the coresponding path for STM32CubeIDE, depending if you are using Windows or MacOS might look something like this:- For Windows:
Project.AddSvdFile ("C:\ST\STM32CubeIDE_1.5.1\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.productdb.debug_1.5.0.202011051456\resources\cmsis\STMicroelectronics_CMSIS_SVD\STM32F767.svd");
. - For MacOS:
Project.AddSvdFile ("/Applications/STM32CubeIDE.app/Contents/Eclipse/plugins/com.st.stm32cube.ide.mcu.productdb.debug_2.1.100.202311191741/resources/cmsis/STMicroelectronics_CMSIS_SVD/STM32F767.svd");
.
- For Windows:
-
For the File.Open settings, the default .elf file is this:
freeRTOS_Nucleo767.elf");
which doesn't match with any of the exercises projects name and needs to be specific for each exercise. Also the path will change according to where each user decided to place its workspace. An example of .elf generated correctly for first exercise- For Windows:
File.Open ("C:\projects\packtBookRTOS\Chapters5_6\Debug\Chapter5_main.elf");
. - For MacOS:
File.Open ("/Users/renatosoriano/RTOS_Workspace/Chapter5_6/Debug/Chapter5_main.elf");
.
Below is the snippet of the .jdebug file for Chapter5 exercise. That would be the only area where those changes are needed, the rest fo the code is fine.
- For Windows:
-
/*********************************************************************
*
* OnProjectLoad
*
* Function description
* Project load routine. Required.
*
**********************************************************************
*/
void OnProjectLoad (void) {
//
// Dialog-generated settings
//
Project.SetTraceSource ("SWO");
Project.SetDevice ("STM32F767ZI");
Project.SetHostIF ("USB", "");
Project.SetTargetIF ("SWD");
Project.SetTIFSpeed ("50 MHz");
Project.AddSvdFile ("/Applications/STM32CubeIDE.app/Contents/Eclipse/plugins/com.st.stm32cube.ide.mcu.productdb.debug_2.1.100.202311191741/resources/cmsis/STMicroelectronics_CMSIS_SVD/STM32F767.svd");
//Project.AddSvdFile ("C:\ST\STM32CubeIDE_1.5.1\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.productdb.debug_1.5.0.202011051456\resources\cmsis\STMicroelectronics_CMSIS_SVD\STM32F767.svd");
Project.SetOSPlugin("FreeRTOSPlugin_CM7");
//
// User settings
//
File.Open ("/Users/renatosoriano/RTOS_Workspace/Chapter5_6/Debug/Chapter5_main.elf");
//File.Open ("C:\projects\packtBookRTOS\Chapters5_6\Debug\Chapter5_main.elf");
}
-
SystemView hangs when run in conjunction with an Ozone debug-session. There are 2 workarounds:
- Don't run an Ozone debug-session when SystemView is recording. If it is running, it can be stopped by clicking on:
Debug: Stop Debug Session
. Ozone itself can then be closed or left open. - In each .jdebug file for Ozone, disable RTT in code settings by adding this line to the *.jdebug file:
Project.SetRTT(0);
.
- Don't run an Ozone debug-session when SystemView is recording. If it is running, it can be stopped by clicking on:
Chapter7_main_taskCreation
:
Chapter8_mainSemExample_1
:
Chapter8_mainSemExample_2
:
Chapter8_mainPolledExample
:
Chapter8_mainSemTimeBound_1
:
Chapter8_mainSemTimeBound_2
:
Chapter8_mainSemPriorityInversion
:
Chapter8_mainMutexExample
:
Chapter8_mainSoftwareTimers
:
Chapter9_mainQueueSimplePassByValue
:
Chapter9_mainQueueCompositePassByValue_Debug
:
Chapter9_mainQueueCompositePassByValue
:
Chapter9_mainQueueCompositePassByReference
:
Chapter9_mainQueueCompositePassByReference_Debug
:
Chapter9_mainTaskNotifications
:
Chapter10_mainUartDMABuff_1
:
Chapter10_mainUartDMABuff_2
:
Chapter10_mainUartDMABuff_3
:
Chapter10_mainUartDMAStreamBufferCont
:
Chapter10_mainUartInterruptBuff
:
Chapter10_mainUartInterruptQueue
:
Chapter10_mainUartPolled
: