Added FreeRTOS

This commit is contained in:
Alexei 2023-01-22 15:25:15 +07:00
parent 22a382e475
commit 35635fe2ea
6 changed files with 269 additions and 78 deletions

View File

@ -40,7 +40,7 @@
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00002000
Stack_Size EQU 0x00000200
AREA STACK, NOINIT, READWRITE, ALIGN = 3
Stack_Mem SPACE Stack_Size
@ -51,7 +51,7 @@ __initial_sp
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00002000
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN = 3
__heap_base
@ -166,6 +166,7 @@ Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
IMPORT prvGetRegistersFromStack
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
@ -178,10 +179,25 @@ NMI_Handler PROC
B .
ENDP
HardFault_Handler PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
movs r1, #4
mov r2, lr
tst r1, r2
bne lable
mrs r0, msp
nop
b lable1
lable
mrs r0, psp
lable1
ldr r1, [r0, #24]
ldr r2, =prvGetRegistersFromStack
bx r2
ENDP
MemManage_Handler PROC
EXPORT MemManage_Handler [WEAK]

View File

@ -50,7 +50,7 @@ extern uint32_t SystemCoreClock;
/* Constants that describe the hardware and memory usage. */
#define configCPU_CLOCK_HZ (SystemCoreClock)
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configTOTAL_HEAP_SIZE ((size_t)4096)
#define configTOTAL_HEAP_SIZE ((size_t)8192)
#define configMINIMAL_STACK_SIZE ((uint16_t)256)
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configSUPPORT_STATIC_ALLOCATION 0
@ -82,15 +82,15 @@ extern uint32_t SystemCoreClock;
#define configUSE_CO_ROUTINES 0
/* Constants provided for debugging and optimisation assistance. */
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configCHECK_FOR_STACK_OVERFLOW 1
#define configQUEUE_REGISTRY_SIZE 0
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
/* Constants that define which hook (callback) functions should be used. */
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configUSE_TICK_HOOK 1
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 1
/* Port specific configuration. */
#define configENABLE_MPU 0
@ -106,7 +106,7 @@ extern uint32_t SystemCoreClock;
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
/* 7 priority levels */
#define configPRIO_BITS 3
#define configPRIO_BITS 4
#endif
/* The lowest interrupt priority that can be used in a call to a "set priority" function. */

View File

@ -20,8 +20,8 @@
#define RTE_RTOS_FreeRTOS_CONFIG /* RTOS FreeRTOS Config for FreeRTOS API */
/* ARM.FreeRTOS::RTOS:Core:Cortex-M:10.5.1 */
#define RTE_RTOS_FreeRTOS_CORE /* RTOS FreeRTOS Core */
/* ARM.FreeRTOS::RTOS:Heap:Heap_4:10.5.1 */
#define RTE_RTOS_FreeRTOS_HEAP_4 /* RTOS FreeRTOS Heap 4 */
/* ARM.FreeRTOS::RTOS:Heap:Heap_2:10.5.1 */
#define RTE_RTOS_FreeRTOS_HEAP_2 /* RTOS FreeRTOS Heap 2 */
/* GigaDevice::Device:GD32F10x_StdPeripherals:EXTI:2.0.2 */
#define RTE_DEVICE_STDPERIPHERALS_EXTI
/* GigaDevice::Device:GD32F10x_StdPeripherals:GPIO:2.0.2 */

View File

@ -153,24 +153,7 @@
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F10x_CL -FS08000000 -FL040000 -FP0($$Device:GD32F107VC$Flash\GD32F10x_CL.FLM))</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>0</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134218370</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename></Filename>
<ExecCommand></ExecCommand>
<Expression>0x08000282</Expression>
</Bp>
</Breakpoint>
<Breakpoint/>
<MemoryWindow1>
<Mm>
<WinNumber>1</WinNumber>
@ -180,7 +163,7 @@
</Mm>
</MemoryWindow1>
<ScvdPack>
<Filename>C:\Users\User\AppData\Local\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd</Filename>
<Filename>E:\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd</Filename>
<Type>ARM.CMSIS-FreeRTOS.10.5.1</Type>
<SubType>1</SubType>
</ScvdPack>
@ -231,7 +214,7 @@
<Group>
<GroupName>Source Group 1</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>

View File

@ -317,28 +317,28 @@
<interw>1</interw>
<Optim>1</Optim>
<oTime>0</oTime>
<SplitLS>0</SplitLS>
<SplitLS>1</SplitLS>
<OneElfS>1</OneElfS>
<Strict>0</Strict>
<EnumInt>0</EnumInt>
<PlainCh>0</PlainCh>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<wLevel>4</wLevel>
<wLevel>3</wLevel>
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>0</uC99>
<uC99>1</uC99>
<uGnu>1</uGnu>
<useXO>0</useXO>
<v6Lang>5</v6Lang>
<v6LangP>3</v6LangP>
<v6LangP>5</v6LangP>
<vShortEn>1</vShortEn>
<vShortWch>1</vShortWch>
<v6Lto>0</v6Lto>
<v6Lto>1</v6Lto>
<v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<MiscControls>-D DEBUG</MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
@ -406,6 +406,75 @@
</Group>
<Group>
<GroupName>::FreeRTOS</GroupName>
<GroupOption>
<CommonProperty>
<UseCPPCompiler>0</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>0</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<GroupArmAds>
<Cads>
<interw>2</interw>
<Optim>0</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
<Aads>
<interw>2</interw>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<thumb>2</thumb>
<SplitLS>2</SplitLS>
<SwStkChk>2</SwStkChk>
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Aads>
</GroupArmAds>
</GroupOption>
</Group>
<Group>
<GroupName>::RTOS</GroupName>
@ -429,7 +498,7 @@
<targetInfo name="Target 1"/>
</targetInfos>
</component>
<component Cbundle="FreeRTOS" Cclass="RTOS" Cgroup="Heap" Cvariant="Heap_4" Cvendor="ARM" Cversion="10.5.1" condition="FreeRTOS Heap">
<component Cbundle="FreeRTOS" Cclass="RTOS" Cgroup="Heap" Cvariant="Heap_2" Cvendor="ARM" Cversion="10.5.1" condition="FreeRTOS Heap">
<package name="CMSIS-FreeRTOS" schemaVersion="1.7.7" url="https://www.keil.com/pack/" vendor="ARM" version="10.5.1"/>
<targetInfos>
<targetInfo name="Target 1"/>
@ -444,25 +513,25 @@
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Buffer Allocation" Cvariant="Buffer Allocation 1" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_buffer_allocation_1 Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos>
<targetInfo name="Target 1"/>
<targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos>
</component>
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Compiler Port" Cvariant="Keil" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_keil_compiler Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos>
<targetInfo name="Target 1"/>
<targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos>
</component>
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Core Library" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_library Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos>
<targetInfo name="Target 1"/>
<targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos>
</component>
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Network Interface" Cvariant="STM32Fxx" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_stm32fxx_network_interface_port Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos>
<targetInfo name="Target 1"/>
<targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos>
</component>
<component Cclass="Device" Cgroup="EVAL" Csub="GD32F107C" Cvendor="GigaDevice" Cversion="2.0.2" condition="GD32F10x STDPERIPHERALS EVAL">

191
main.c
View File

@ -1,24 +1,177 @@
#include "FreeRTOS.h"
#include "FreeRTOSConfig.h"
#include "task.h"
#include "gd32f107c_eval.h"
#include "gd32f10x_gpio.h"
#include "stdio.h"
#define BUTTON_USER GPIO_PIN_14
#define LED_USER GPIO_PIN_0
char ButtonState = 0;
#define LED2_USER GPIO_PIN_0
#define LED5_TICK GPIO_PIN_1
void vTaskHelloWorld( void *pvParameters);
void vTaskToggleLed( void *pvParameters);
int stdout_putchar (int ch);
int stdin_getchar (void);
void DelayMS(unsigned char ms);
int stdout_putchar (int ch)
{
usart_data_transmit(EVAL_COM1, (uint16_t)ch);
DelayMS(1);
while (!usart_flag_get(EVAL_COM1, USART_FLAG_TBE)){}
return ch;
}
int stdin_getchar (void)
{
return usart_data_receive(EVAL_COM1);
}
/*! \brief InitMCU
* Initial MCU configuration
*/
static void InitMCU(void)
{
SystemInit();
//gd_eval_led_init(LED2);
//gd_eval_led_on(LED2);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, LED2_USER);
gpio_bit_set(GPIOC, LED2_USER);
rcu_periph_clock_enable(RCU_GPIOE);
gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, LED5_TICK);
gpio_bit_set(GPIOE, LED5_TICK);
gd_eval_com_init(EVAL_COM1);
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, BUTTON_USER);
}
/*! \brief vTaskHelloWorld procedure
*
* \param Not Used.
*/
void vTaskHelloWorld( void *pvParameters)
{
char ButtonState = 0;
for( ;; )
{
ButtonState = !gpio_input_bit_get(GPIOB, BUTTON_USER);
if (ButtonState)
{
printf("Hello world\n");
vTaskDelay(500);
}
}
}
/*! \brief vTaskToggleLed procedure
*
* \param Not Used.
*/
void vTaskToggleLed( void *pvParameters)
{
char toggle = 1;
for( ;; )
{
if (toggle)
{
gpio_bit_reset(GPIOC, LED2_USER);
}
else
{
gpio_bit_set(GPIOC, LED2_USER);
}
toggle = !toggle;
vTaskDelay(125);
}
}
int main(void)
{
InitMCU();
xTaskCreate(vTaskToggleLed, "ToggleLed", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
xTaskCreate(vTaskHelloWorld, "HelloWorld", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
vTaskStartScheduler();
while(1);
}
/**
* task.h
* @code{c}
* void vApplicationMallocFailedHook( void )
* @endcode
*
* This hook function is called when allocation failed.
*/
void vApplicationMallocFailedHook( void )
{
#if defined (DEBUG)
__ASM("BKPT #0\n");
#endif
NVIC_SystemReset();
while(TRUE){}
}
/*! \func vApplicationTickHook( void )
* \brief Toggles LED5_TICK to indicate RTOS running well
*/
void vApplicationTickHook( void )
{
static uint16_t tickCounter = 0;
if(++tickCounter == configTICK_RATE_HZ)
{
gpio_bit_reset(GPIOE, LED5_TICK);
tickCounter = 0;
}
else if(tickCounter == configTICK_RATE_HZ/2)
{
gpio_bit_set(GPIOE, LED5_TICK);
}
}
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
{
#if defined (DEBUG)
__ASM("BKPT #0\n");
#endif
NVIC_SystemReset();
while(TRUE){}
}
__attribute__((used)) void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
{
/* These are volatile to try and prevent the compiler/linker optimising them
away as the variables never actually get used. If the debugger won't show the
values of the variables, make them global my moving their declaration outside
of this function. */
static volatile uint32_t r0;
static volatile uint32_t r1;
static volatile uint32_t r2;
static volatile uint32_t r3;
static volatile uint32_t r12;
static volatile uint32_t lr; /* Link register. */
static volatile uint32_t pc; /* Program counter. */
static volatile uint32_t psr;/* Program status register. */
r0 = pulFaultStackAddress[ 0 ];
r1 = pulFaultStackAddress[ 1 ];
r2 = pulFaultStackAddress[ 2 ];
r3 = pulFaultStackAddress[ 3 ];
r12 = pulFaultStackAddress[ 4 ];
lr = pulFaultStackAddress[ 5 ];
pc = pulFaultStackAddress[ 6 ];
psr = pulFaultStackAddress[ 7 ];
#ifdef DEBUG
__asm volatile("BKPT #0\n") ;
#endif
NVIC_SystemReset();
/* When the following line is hit, the variables contain the register values. */
for( ;; );
}
void DelayMS(unsigned char ms)
{
unsigned long us = 1000*ms;
@ -28,33 +181,3 @@ while (us--)
__NOP();
}
}
{
while (1)
{
ButtonState = !gpio_input_bit_get(GPIOB, BUTTON_USER);
if (ButtonState)
{
printf("Hello world\n");
DelayMS(250);
DelayMS(250);
}
}
}
int main(void)
{
SystemInit();
//gd_eval_led_init(LED2);
//gd_eval_led_on(LED2);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, LED_USER);
gpio_bit_set(GPIOC, LED_USER);
gd_eval_com_init(EVAL_COM1);
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, BUTTON_USER);
xPortStartScheduler();
while(1);
}