1、【增加】RT-Thread 系统 Demo。

Signed-off-by: armink <armink.ztl@gmail.com>
This commit is contained in:
armink
2017-04-15 15:14:49 +08:00
parent cee09e4a57
commit b536a063d6
247 changed files with 137359 additions and 2 deletions
+13
View File
@@ -0,0 +1,13 @@
#include "app_task.h"
int main(void){
/* disable interrupt first */
rt_hw_interrupt_disable();
/* startup RT-Thread RTOS */
rtthread_startup();
return 0;
}
@@ -0,0 +1,57 @@
#include <ucos_ii.h>
#include <cpu_core.h>
#include <bsp.h>
#include <cm_backtrace.h>
#include <stdio.h>
#define HARDWARE_VERSION "V1.0.0"
#define SOFTWARE_VERSION "V0.1.0"
static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
static void AppTaskStart(void *p_arg);
extern void fault_test_by_unalign(void);
extern void fault_test_by_div0(void);
int main(void)
{
INT8U err;
BSP_IntDisAll();
BSP_Init();
CPU_Init();
OSInit();
/* CmBacktrace initialize */
cm_backtrace_init("CmBacktrace", HARDWARE_VERSION, SOFTWARE_VERSION);
OSTaskCreateExt((void (*)(void *)) AppTaskStart,
(void *) 0,
(OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1],
(INT8U ) APP_TASK_START_PRIO,
(INT16U ) APP_TASK_START_PRIO,
(OS_STK *)&AppTaskStartStk[0],
(INT32U ) APP_TASK_START_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
OSTaskNameSet(APP_TASK_START_PRIO, "app_start", &err);
printf("System initialize finish. Starting..\r\n");
OSStart();
return (1);
}
static void AppTaskStart (void *p_arg)
{
// fault_test_by_unalign();
fault_test_by_div0();
while (DEF_TRUE) {
LED_RUN_ON;
OSTimeDlyHMSM(0, 0, 0, 500);
LED_RUN_OFF;
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
@@ -0,0 +1,184 @@
#include "app_task.h"
#include <stdlib.h>
#include <stdio.h>
#include <bsp.h>
#include <finsh.h>
#include <shell.h>
#include <delay_conf.h>
#include <cpuusage.h>
#include <utils.h>
#include <cm_backtrace.h>
#define thread_sys_monitor_prio 30
#define HARDWARE_VERSION "V1.0.0"
#define SOFTWARE_VERSION "V0.1.0"
extern void fault_test_by_unalign(void);
extern void fault_test_by_div0(void);
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t thread_sys_monitor_stack[512];
struct rt_thread thread_sys_monitor;
uint8_t cpu_usage_major, cpu_usage_minor;
/**
* System monitor thread.
*
* @param parameter parameter
*/
void thread_entry_sys_monitor(void* parameter)
{
extern void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor);
/* CmBacktrace test */
// fault_test_by_unalign();
fault_test_by_div0();
while (1)
{
if(get_system_status() == SYSTEM_STATUS_RUN){
cpu_usage_get(&cpu_usage_major, &cpu_usage_minor);
LED_RUN_ON;
rt_thread_delay(DELAY_SYS_RUN_LED_ON);
LED_RUN_OFF;
rt_thread_delay(DELAY_SYS_RUN_LED_OFF);
} else if (get_system_status() == SYSTEM_STATUS_INIT){
LED_RUN_ON;
rt_thread_delay(DELAY_SYS_INIT_LED_ON);
LED_RUN_OFF;
rt_thread_delay(DELAY_SYS_INIT_LED_OFF);
} else if (get_system_status() == SYSTEM_STATUS_FAULT){
LED_RUN_ON;
rt_thread_delay(DELAY_SYS_FAULT_LED_ON);
LED_RUN_OFF;
rt_thread_delay(DELAY_SYS_FAULT_LED_OFF);
}
IWDG_Feed();
}
}
static rt_err_t exception_hook(void *context) {
extern long list_thread(void);
uint8_t _continue = 1;
rt_enter_critical();
#ifdef RT_USING_FINSH
list_thread();
#endif
cm_backtrace_fault(*((uint32_t *)(__get_SP() + sizeof(uint32_t) * 8)), __get_SP() + sizeof(uint32_t) * 9);
while (_continue == 1);
return RT_EOK;
}
/**
* System initialization thread.
*
* @param parameter parameter
*/
void sys_init_thread(void* parameter){
set_system_status(SYSTEM_STATUS_INIT);
/* CmBacktrace initialize */
cm_backtrace_init("CmBacktrace", HARDWARE_VERSION, SOFTWARE_VERSION);
/* set exception hook */
rt_hw_exception_install(exception_hook);
/* initialize OK and switch to running status */
set_system_status(SYSTEM_STATUS_RUN);
rt_thread_delete(rt_thread_self());
}
int rt_application_init(void)
{
rt_thread_t init_thread = NULL;
rt_thread_init(&thread_sys_monitor,
"sys_monitor",
thread_entry_sys_monitor,
RT_NULL,
thread_sys_monitor_stack,
sizeof(thread_sys_monitor_stack),
thread_sys_monitor_prio, 5);
rt_thread_startup(&thread_sys_monitor);
init_thread = rt_thread_create("sys init", sys_init_thread,
NULL, 512, 10, 10);
if (init_thread != NULL) {
rt_thread_startup(init_thread);
}
return 0;
}
/**
* This function will startup RT-Thread RTOS.
*/
void rtthread_startup(void)
{
extern void cpu_usage_init(void);
/* init board */
rt_hw_board_init();
/* show version */
rt_show_version();
/* init tick */
rt_system_tick_init();
/* init kernel object */
rt_system_object_init();
/* init timer system */
rt_system_timer_init();
#ifdef RT_USING_HEAP
/* init memory system */
rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END);
#endif
/* init scheduler system */
rt_system_scheduler_init();
/* initialize timer */
rt_system_timer_init();
/* init timer thread */
rt_system_timer_thread_init();
/* Add CPU usage to system */
cpu_usage_init();
#ifdef RT_USING_COMPONENTS_INIT
/* initialization RT-Thread Components */
rt_components_init();
#endif
#ifdef RT_USING_FINSH
/* init finsh */
finsh_system_init();
finsh_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
#ifdef RT_USING_COMPONENTS_INIT
/* initialization RT-Thread Components */
rt_components_init();
#endif
/* init application */
rt_application_init();
/* init idle thread */
rt_thread_idle_init();
/* start scheduler */
rt_system_scheduler_start();
/* never reach here */
return;
}
@@ -0,0 +1,40 @@
/*
* fault_test.c
*
* Created on: 2016/12/25
* Author: Armink
*/
#include <stdio.h>
void fault_test_by_unalign(void) {
volatile int * SCB_CCR = (volatile int *) 0xE000ED14; // SCB->CCR
volatile int * p;
volatile int value;
*SCB_CCR |= (1 << 3); /* bit3: UNALIGN_TRP. */
p = (int *) 0x00;
value = *p;
printf("addr:0x%02X value:0x%08X\r\n", (int) p, value);
p = (int *) 0x04;
value = *p;
printf("addr:0x%02X value:0x%08X\r\n", (int) p, value);
p = (int *) 0x03;
value = *p;
printf("addr:0x%02X value:0x%08X\r\n", (int) p, value);
}
void fault_test_by_div0(void) {
volatile int * SCB_CCR = (volatile int *) 0xE000ED14; // SCB->CCR
int x, y, z;
*SCB_CCR |= (1 << 4); /* bit4: DIV_0_TRP. */
x = 10;
y = 0;
z = x / y;
printf("z:%d\n", z);
}
@@ -0,0 +1,147 @@
/**
******************************************************************************
* @file Project/STM32F4xx_StdPeriph_Templates/stm32f4xx_it.c
* @author MCD Application Team
* @version V1.5.0
* @date 06-March-2015
* @brief Main Interrupt Service Routines.
* This file provides template for all exceptions handler and
* peripherals interrupt service routine.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_it.h"
#include "bsp.h"
/** @addtogroup Template_Project
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
/* Cortex-M4 Processor Exceptions Handlers */
/******************************************************************************/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None
*/
void NMI_Handler(void)
{
}
/**
* @brief This function handles Memory Manage exception.
* @param None
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Bus Fault exception.
* @param None
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Usage Fault exception.
* @param None
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles SVCall exception.
* @param None
* @retval None
*/
void SVC_Handler(void)
{
}
/**
* @brief This function handles Debug Monitor exception.
* @param None
* @retval None
*/
void DebugMon_Handler(void)
{
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
rt_hw_timer_handler();
}
/******************************************************************************/
/* STM32F4xx Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f4xx.s). */
/******************************************************************************/
/**
* @brief This function handles PPP interrupt request.
* @param None
* @retval None
*/
/*void PPP_IRQHandler(void)
{
}*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
@@ -0,0 +1,21 @@
/*
* user_finsh_cmd.c
*
* Created on: 2013Äê12ÔÂ7ÈÕ
* Author: Armink
*/
#include <rthw.h>
#include <rtthread.h>
#include <stm32f4xx_conf.h>
#include "finsh.h"
void reboot(uint8_t argc, char **argv) {
NVIC_SystemReset();
}
MSH_CMD_EXPORT(reboot, Reboot System);
void get_cpuusage(void) {
extern uint8_t cpu_usage_major, cpu_usage_minor;
rt_kprintf("The CPU usage is %d.%d% now.\n", cpu_usage_major, cpu_usage_minor);
}
MSH_CMD_EXPORT(get_cpuusage, Get control board cpu usage);