diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2015-12-06 13:27:14 +0100 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2015-12-06 13:27:14 +0100 |
commit | c2d831e0665ab3184aac1211b8914f720a7e3851 (patch) | |
tree | 72e497f1908382cab3f5083146a3b284c515af65 /src/freertos-example | |
parent | 29a4fd0917f81ce5c50df5bd4cc960f84a24517c (diff) | |
download | glutte-o-matic-c2d831e0665ab3184aac1211b8914f720a7e3851.tar.gz glutte-o-matic-c2d831e0665ab3184aac1211b8914f720a7e3851.tar.bz2 glutte-o-matic-c2d831e0665ab3184aac1211b8914f720a7e3851.zip |
Remove test1, add freertos-example
Diffstat (limited to 'src/freertos-example')
l--------- | src/freertos-example/FreeRTOS | 1 | ||||
-rw-r--r-- | src/freertos-example/FreeRTOSConfig.h | 165 | ||||
-rw-r--r-- | src/freertos-example/Makefile | 118 | ||||
-rw-r--r-- | src/freertos-example/bin/.git_keep | 0 | ||||
l--------- | src/freertos-example/bsp | 1 | ||||
-rw-r--r-- | src/freertos-example/main.c | 137 | ||||
-rw-r--r-- | src/freertos-example/main.h | 5 |
7 files changed, 427 insertions, 0 deletions
diff --git a/src/freertos-example/FreeRTOS b/src/freertos-example/FreeRTOS new file mode 120000 index 0000000..51f4e96 --- /dev/null +++ b/src/freertos-example/FreeRTOS @@ -0,0 +1 @@ +../FreeRTOS
\ No newline at end of file diff --git a/src/freertos-example/FreeRTOSConfig.h b/src/freertos-example/FreeRTOSConfig.h new file mode 100644 index 0000000..0096216 --- /dev/null +++ b/src/freertos-example/FreeRTOSConfig.h @@ -0,0 +1,165 @@ +/*
+ FreeRTOS V8.0.0:rc2 - Copyright (C) 2014 Real Time Engineers Ltd.
+ All rights reserved
+
+ VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
+
+ ***************************************************************************
+ * *
+ * FreeRTOS provides completely free yet professionally developed, *
+ * robust, strictly quality controlled, supported, and cross *
+ * platform software that has become a de facto standard. *
+ * *
+ * Help yourself get started quickly and support the FreeRTOS *
+ * project by purchasing a FreeRTOS tutorial book, reference *
+ * manual, or both from: http://www.FreeRTOS.org/Documentation *
+ * *
+ * Thank you! *
+ * *
+ ***************************************************************************
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
+
+ >>! NOTE: The modification to the GPL is included to allow you to distribute
+ >>! a combined work that includes FreeRTOS without being obliged to provide
+ >>! the source code for proprietary components outside of the FreeRTOS
+ >>! kernel.
+
+ FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. Full license text is available from the following
+ link: http://www.freertos.org/a00114.html
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong?" *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+ http://www.FreeRTOS.org - Documentation, books, training, latest versions,
+ license and Real Time Engineers Ltd. contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool, a DOS
+ compatible FAT file system, and our tiny thread aware UDP/IP stack.
+
+ http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
+ Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
+ licenses offer ticketed support, indemnification and middleware.
+
+ http://www.SafeRTOS.com - High Integrity Systems also provide a safety
+ engineered and independently SIL3 certified version for use in safety and
+ mission critical applications that require provable dependability.
+
+ 1 tab == 4 spaces!
+*/
+
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+/* Ensure stdint is only used by the compiler, and not the assembler. */
+//#ifdef __ICCARM__
+ #include <stdint.h>
+ extern uint32_t SystemCoreClock;
+//#endif
+
+#define configUSE_PREEMPTION 1
+#define configUSE_IDLE_HOOK 0 // Default: 1
+#define configUSE_TICK_HOOK 0 // Default: 1
+#define configCPU_CLOCK_HZ ( SystemCoreClock )
+#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
+#define configMAX_PRIORITIES ( 5 )
+#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) )
+#define configMAX_TASK_NAME_LEN ( 10 )
+#define configUSE_TRACE_FACILITY 1
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 1
+#define configUSE_MUTEXES 1
+#define configQUEUE_REGISTRY_SIZE 8
+#define configCHECK_FOR_STACK_OVERFLOW 0 // Default: 2
+#define configUSE_RECURSIVE_MUTEXES 1
+#define configUSE_MALLOC_FAILED_HOOK 0 // Default: 1
+#define configUSE_APPLICATION_TASK_TAG 0
+#define configUSE_COUNTING_SEMAPHORES 1
+#define configGENERATE_RUN_TIME_STATS 0
+
+/* Co-routine definitions. */
+#define configUSE_CO_ROUTINES 0
+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
+
+/* Software timer definitions. */
+#define configUSE_TIMERS 1
+#define configTIMER_TASK_PRIORITY ( 2 )
+#define configTIMER_QUEUE_LENGTH 10
+#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
+
+/* Set the following definitions to 1 to include the API function, or zero
+to exclude the API function. */
+#define INCLUDE_vTaskPrioritySet 1
+#define INCLUDE_uxTaskPriorityGet 1
+#define INCLUDE_vTaskDelete 1
+#define INCLUDE_vTaskCleanUpResources 1
+#define INCLUDE_vTaskSuspend 1
+#define INCLUDE_vTaskDelayUntil 1
+#define INCLUDE_vTaskDelay 1
+
+/* Cortex-M specific definitions. */
+#ifdef __NVIC_PRIO_BITS
+ /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
+ #define configPRIO_BITS __NVIC_PRIO_BITS
+#else
+ #define configPRIO_BITS 4 /* 15 priority levels */
+#endif
+
+/* The lowest interrupt priority that can be used in a call to a "set priority"
+function. */
+#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf
+
+/* The highest interrupt priority that can be used by any interrupt service
+routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
+INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
+PRIORITY THAN THIS! (higher priorities are lower numeric values. */
+#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
+
+/* Interrupt priorities used by the kernel port layer itself. These are generic
+to all Cortex-M ports, and do not rely on any particular library functions. */
+#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
+See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
+#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+
+/* Normal assert() semantics without relying on the provision of an assert.h
+header file. */
+#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
+
+/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
+standard names. */
+#define vPortSVCHandler SVC_Handler
+#define xPortPendSVHandler PendSV_Handler
+#define xPortSysTickHandler SysTick_Handler
+
+#endif /* FREERTOS_CONFIG_H */
+
diff --git a/src/freertos-example/Makefile b/src/freertos-example/Makefile new file mode 100644 index 0000000..a0d377a --- /dev/null +++ b/src/freertos-example/Makefile @@ -0,0 +1,118 @@ +### +# GNU ARM Embedded Toolchain +CC=arm-none-eabi-gcc +LD=arm-none-eabi-ld +AR=arm-none-eabi-ar +AS=arm-none-eabi-as +CP=arm-none-eabi-objcopy +OD=arm-none-eabi-objdump +SIZE=arm-none-eabi-size + +### +# Directory Structure +BINDIR=bin +SRCDIR=. + +### +# Find source files +ASOURCES=$(shell find -L $(SRCDIR) -name '*.s') +CSOURCES+=$(shell find -L $(SRCDIR) -name '*.c') +# Find header directories +INC=$(shell find -L . -name '*.h' -exec dirname {} \; | uniq) +INCLUDES=$(INC:%=-I%) +# Create object list +OBJECTS=$(ASOURCES:%.s=%.o) +OBJECTS+=$(CSOURCES:%.c=%.o) +# Define output files ELF & IHEX +BINELF=outp.elf +BINHEX=outp.hex + +### +# MCU FLAGS +MCFLAGS=-mcpu=cortex-m4 -mthumb -mlittle-endian \ +-mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb-interwork +# COMPILE FLAGS +DEFS=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX +CFLAGS =-c $(MCFLAGS) $(DEFS) $(INCLUDES) +# LINKER FLAGS +LDSCRIPT= bsp/stm32_flash.ld +LDFLAGS =-T $(LDSCRIPT) --specs=nosys.specs $(MCFLAGS) + +### +# Optimizations +OPT?='O1 O2 O3 O4 O6 O7' # O5 disabled by default, because it breaks code + +ifneq ($(findstring release-memopt,$(MAKECMDGOALS)),) +ifneq ($(filter O1,$(OPT)),) +CXXFLAGS+=-fno-exceptions # Uncomment to disable exception handling +DEFS+=-DNO_EXCEPTIONS # The source code has to comply with this rule +endif + +ifneq ($(filter O2,$(OPT)),) +CFLAGS+=-Os # Optimize for size https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html +CXXFLAGS+=-Os +LDFLAGS+=-Os # Optimize for size https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html +endif + +ifneq ($(filter O3,$(OPT)),) +CFLAGS+=-ffunction-sections -fdata-sections # Place each function or data item into its own section in the output file +CXXFLAGS+=-ffunction-sections -fdata-sections # -||- +LDFLAGS+=-Wl,-gc-sections # Remove isolated unused sections +endif + +ifneq ($(filter O4,$(OPT)),) +CFLAGS+=-fno-builtin # Disable C++ exception handling +CXXFLAGS+=-fno-builtin # Disable C++ exception handling +endif + +ifneq ($(filter O5,$(OPT)),) +CFLAGS+=-flto # Enable link time optimization +CXXFLAGS+=-flto # Enable link time optimization +LDFLAGS+=-flto # Enable link time optimization +endif + +ifneq ($(filter O6,$(OPT)),) +CXXFLAGS+=-fno-rtti # Disable type introspection +endif + +ifneq ($(findstring O7,$(OPT)),) +LDFLAGS+=--specs=nano.specs # Use size optimized newlib +endif +endif + +### +# Build Rules +.PHONY: all release release-memopt debug clean + +all: release + +release: $(BINDIR)/$(BINHEX) + +release-memopt: release + +debug: CFLAGS+=-g +debug: LDFLAGS+=-g +debug: release + +$(BINDIR)/$(BINHEX): $(BINDIR)/$(BINELF) + $(CP) -O ihex $< $@ + +$(BINDIR)/$(BINELF): $(OBJECTS) + $(CC) $(LDFLAGS) $(OBJECTS) -o $@ + $(SIZE) $(BINDIR)/$(BINELF) + +%.o: %.c + $(CC) $(CFLAGS) $< -o $@ + +%.o: %.s + $(CC) $(CFLAGS) $< -o $@ + +clean: + rm -f $(OBJECTS) $(BINDIR)/$(BINELF) $(BINDIR)/$(BINHEX) + +deploy: +ifeq ($(wildcard /opt/openocd/bin/openocd),) + /usr/bin/openocd -f /usr/share/openocd/scripts/board/stm32f4discovery.cfg -c "program bin/"$(BINELF)" verify reset" +else + /opt/openocd/bin/openocd -f /opt/openocd/share/openocd/scripts/board/stm32f4discovery.cfg -c "program bin/"$(BINELF)" verify reset" +endif diff --git a/src/freertos-example/bin/.git_keep b/src/freertos-example/bin/.git_keep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/freertos-example/bin/.git_keep diff --git a/src/freertos-example/bsp b/src/freertos-example/bsp new file mode 120000 index 0000000..5d9120a --- /dev/null +++ b/src/freertos-example/bsp @@ -0,0 +1 @@ +../bsp
\ No newline at end of file diff --git a/src/freertos-example/main.c b/src/freertos-example/main.c new file mode 100644 index 0000000..687de08 --- /dev/null +++ b/src/freertos-example/main.c @@ -0,0 +1,137 @@ +/* Board includes */
+#include "stm32f4xx_gpio.h"
+#include "stm32f4xx_rcc.h"
+/* Kernel includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "timers.h"
+#include "semphr.h"
+
+#define BLOCK_
+
+void ToggleLED_Timer(void*);
+void DetectButtonPress(void*);
+void ToggleLED_IPC(void*);
+void initHW();
+
+xQueueHandle pbq;
+
+int main(void)
+{
+
+ initHW();
+
+ /* Create IPC variables */
+ pbq = xQueueCreate(10, sizeof(int));
+ if (pbq == 0) {
+ while(1); /* fatal error */
+ }
+
+ /* Create tasks */
+ xTaskCreate(
+ ToggleLED_Timer, /* Function pointer */
+ "Task1", /* Task name - for debugging only*/
+ configMINIMAL_STACK_SIZE, /* Stack depth in words */
+ (void*) NULL, /* Pointer to tasks arguments (parameter) */
+ tskIDLE_PRIORITY + 2UL, /* Task priority*/
+ NULL /* Task handle */
+ );
+
+ xTaskCreate(
+ DetectButtonPress,
+ "Task2",
+ configMINIMAL_STACK_SIZE,
+ (void*) NULL,
+ tskIDLE_PRIORITY + 2UL,
+ NULL);
+
+ xTaskCreate(
+ ToggleLED_IPC,
+ "Task3",
+ configMINIMAL_STACK_SIZE,
+ (void*) NULL,
+ tskIDLE_PRIORITY + 2UL,
+ NULL);
+
+ /* Start the RTOS Scheduler */
+ vTaskStartScheduler();
+
+ /* HALT */
+ while(1);
+}
+
+/* TASK 1: Toggle LED via RTOS Timer */
+void ToggleLED_Timer(void *pvParameters){
+
+ while (1) {
+ GPIO_ToggleBits(GPIOD, GPIO_Pin_12);
+
+ /*
+ Delay for a period of time. vTaskDelay() places the task into
+ the Blocked state until the period has expired.
+ The delay period is spacified in 'ticks'. We can convert
+ yhis in milisecond with the constant portTICK_RATE_MS.
+ */
+ vTaskDelay(1500 / portTICK_RATE_MS);
+ }
+}
+
+/* TASK 2: Detect Button Press
+ * And Signal Event via Inter-Process Communication (IPC)
+ */
+void DetectButtonPress(void *pvParameters){
+
+ int sig = 1;
+
+ while (1) {
+ /* Detect Button Press */
+ if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)>0) {
+ while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)>0)
+ vTaskDelay(100 / portTICK_RATE_MS); /* Button Debounce Delay */
+ while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
+ vTaskDelay(100 / portTICK_RATE_MS); /* Button Debounce Delay */
+
+ xQueueSendToBack(pbq, &sig, 0); /* Send Message */
+ }
+ }
+}
+
+/* TASK 3: Toggle LED via Inter-Process Communication (IPC) */
+void ToggleLED_IPC(void *pvParameters) {
+
+ int sig;
+ portBASE_TYPE status;
+
+ while (1) {
+ status = xQueueReceive(pbq, &sig, portMAX_DELAY); /* Receive Message */
+ /* portMAX_DELAY blocks task indefinitely if queue is empty */
+ if(status == pdTRUE) {
+ GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
+ }
+ }
+}
+
+/* Init HW */
+void initHW()
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitTypeDef GPIO_InitStructure2;
+
+ // Init LED
+ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+ GPIO_Init(GPIOD, &GPIO_InitStructure);
+
+ // Init PushButton
+ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
+ GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_IN;
+ GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_0;
+ GPIO_InitStructure2.GPIO_PuPd = GPIO_PuPd_NOPULL;
+ GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_100MHz;
+ GPIO_InitStructure2.GPIO_OType = GPIO_OType_PP;
+ GPIO_Init(GPIOA, &GPIO_InitStructure2);
+}
diff --git a/src/freertos-example/main.h b/src/freertos-example/main.h new file mode 100644 index 0000000..0c8870c --- /dev/null +++ b/src/freertos-example/main.h @@ -0,0 +1,5 @@ +#ifndef __MAIN_H_
+#define __MAIN_H_
+
+#endif
+
|