Summary
In the last article I showed you clever FreeRTOS PSoC Component… and the talked about some of the issues that I had with it. In this article I will talk about a self-contained FreeRTOS PSoC Template project that includes everything for FreeRTOS and Tracealyzer all in one project. My idea was that when I start a new project I will just make a copy of the template project, rename it, then move on.
My FreeRTOS PSoC Template has
- FreeRTOS with the files in in the same directory (i.e. not referenced externally)
- Tracealyzer with the files in the same directory & all of the streamports including RTT and the UART DMA
- All of the files organized into PSoC Creator folders
- A template main.c
- All of the build settings configured
This project is checked into GitHub and you can find it git@github.com:iotexpert/PSoC-FreeRTOS-Template.git
Building the FreeRTOS PSoC Template
I started the process by creating a blank PSoC project called “FreeRTOS_Template”. I then went into the Windows Explorer and copied the entire FreeRTOS source directory into the FreeRTOS PSoC Template Project directory. Then I copied the Percepio TraceRecorder library into the FreeRTOS PSoC Template project.
By having both of the source directories in my project it isolated this project from changes in the FreeRTOS or the TraceRecorder. Obviously that is a double edged sword. The next thing that I did was use the Windows Explorer to copy FreeRTOSConfig.h, trcConfig.h, trcSnapshotConfig.h and trcStreamingConfig.h into the project. Once all of the files were in my project directory is was time to fix up the PSoC Creator Project.
To do this I created a folder called “FreeRTOS_Source” in the “Header Files” and “Source Files” folders in my template project. You can do this by right clicking and selecting “Add->New Folder”. Then I added all of the appropriate .h and .c files from FreeRTOS source directory. This gives me the following project view:
And Source Files (notice that I also added heap_4.c which I generally use for memory management)
Then I add the configuration files FreeRTOSConfig.h, trcConfig.h, trcSnapshotConfig.h, trcStreamingConfig.h and trcStreamingport.h. Next I do the same thing for the TraceRecorder library which makes my project look like this:
Then I modify the build settings to add the include directories:
Now you can modify the FreeRTOSConfig.h to include all of the Tracealyzer stuff:
/* A header file that defines trace macro can be included here. */ #if ( configUSE_TRACE_FACILITY == 1 ) #include "trcRecorder.h" #endif #endif /* FREERTOS_CONFIG_H */
Then I setup a new tab in the schematic to contain the DMA UART Streamport. You can read all about the UART DMA Streamport in this article.
By putting that part of the stream port on a separate schematic page I can now do a right click and disable the page when I am not using the Tracealyzer streamport. Disabling a page of the schematic completely removes everything from the build.
Next I create files called FreeRTOS_Start.h/.c to put in the startup code:
#include <project.h> #include "FreeRTOS.h" extern void xPortPendSVHandler(void); extern void xPortSysTickHandler(void); extern void vPortSVCHandler(void); #define CORTEX_INTERRUPT_BASE (16) void FreeRTOS_Start() { /* Handler for Cortex Supervisor Call (SVC, formerly SWI) - address 11 */ CyIntSetSysVector( CORTEX_INTERRUPT_BASE + SVCall_IRQn, (cyisraddress)vPortSVCHandler ); /* Handler for Cortex PendSV Call - address 14 */ CyIntSetSysVector( CORTEX_INTERRUPT_BASE + PendSV_IRQn, (cyisraddress)xPortPendSVHandler ); /* Handler for Cortex SYSTICK - address 15 */ CyIntSetSysVector( CORTEX_INTERRUPT_BASE + SysTick_IRQn, (cyisraddress)xPortSysTickHandler ); }
Finally I make a template main.c that starts everything and has a simple ledTask and instructions for changing Memory Management scheme and the TraceRecorder.
// This template has heap_4.c included in the project. If you want a // different heap scheme then remove heap_4 from the project and add // the other scheme from FreeRTOS/Source/portable/memmag // TraceRecorder // There are methods // 1. Snapshot mode // 2. Streaming UART/DMA // 3. Streaming JLINK RTT // // To use method 1: // - in FreeRTOSConfig.h make this line be 1 (currently line 45) //#define configUSE_TRACE_FACILITY 1 // - in trcConfig.h configure the TRC_CFG_RECORDER // #define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_SNAPSHOT // // To use method 2: // - in FreeRTOSConfig.h make this line be 1 (currently line 45) //#define configUSE_TRACE_FACILITY 1 // - in trcConfig.h configure the TRC_CFG_RECORDER //#define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_STREAMING // // This project currently has the PSoC UART Streaming Port // add the TraceRecorder/streamports/PSoC_Serial/trcStreamingPort.c to the project // add the TraceRecorder/streamports/PSoC_Serial/include/trcStreamingPort.h // add the TraceRecorder/streamports/PSoC_Serial/include to the compiler include directories // Enable the Trace_DMA schematic sheet and make sure UART pins are assigned correctly // This port depends on the UART being named UART and the DMA being named "DMA" // // To use method 3: JLINK RTT // Remove the previous streamport files from the project // Remove the Streamport include path // add the TraceRecorder/streamports/JLink_RTT/Segger_RTT.c to the project // add the TraceRecorder/streamports/JLink_RTT/Segger_RTT_Printf.c to the project // add the TraceRecorder/streamports/JLink_RTT/include/trcStreamingPort.h // add the TraceRecorder/streamports/JLink_RTT/include/Segger_RTT.h // add the TraceRecorder/streamports/JLink_RTT/include/Segger_RTT_Conf.h // add the TraceRecorder/streamports/JLink_RTT/include to the compiler include directories #include "project.h" #include "FreeRTOS.h" #include "timers.h" // An example Task void ledTask(void *arg) { (void)arg; while(1) { RED_Write(~RED_Read()); vTaskDelay(500); } } int main(void) { CyGlobalIntEnable; FreeRTOS_Start(); #if ( configUSE_TRACE_FACILITY == 1 ) vTraceEnable(TRC_START); #endif xTaskCreate(ledTask,"LED Task",configMINIMAL_STACK_SIZE,0,1,0); vTaskStartScheduler(); // Will never return while(1); // Eliminate compiler warning }
Topic
Description
FreeRTOS: A PSoC4 FreeRTOS Port
An introduction to making FreeRTOS work on PSoC 4
FreeRTOS PSoC Examples
Using multiple tasks in FreeRTOS
FreeRTOS Queue Example
Using a queue to communicate between tasks
PSoC 6 FreeRTOS - The First Example
Booting FreeRTOS on PSoC 6
FreeRTOS Binary Semaphore
An first example of a binary semaphore
FreeRTOS Binary Semaphore (Part 2)
Removing polling in the UART Task
FreeRTOS Counting Semaphore
An example using a counting semaphore
PSoC FreeRTOS
Reading I2C Sensors with a shared I2C Bus
PSoC FreeRTOS Task Notify
A light weight scheme to replace Semaphores
PSoC FreeRTOS Task Notification Values
A very light weight method to transfer one word of information into a task