You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
EasyFlash/demo/env/stm32f4xx/app/src/app_task.c

182 lines
4.3 KiB
C

#include "app_task.h"
#include <stdlib.h>
#include <stdio.h>
#include "bsp.h"
#include "easyflash.h"
#include "finsh.h"
#include "shell.h"
#include "delay_conf.h"
#include "cpuusage.h"
#include "utils.h"
#define thread_sys_monitor_prio 30
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);
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();
}
}
/**
* Env demo.
*/
void test_env(void) {
uint32_t i_boot_times = NULL;
char *c_old_boot_times, c_new_boot_times[11] = {0};
/* get the boot count number from Env */
c_old_boot_times = ef_get_env("boot_times");
RT_ASSERT(c_old_boot_times);
i_boot_times = atol(c_old_boot_times);
/* boot count +1 */
i_boot_times ++;
rt_kprintf("The system now boot %d times\n", i_boot_times);
/* interger to string */
sprintf(c_new_boot_times,"%ld", i_boot_times);
/* set and store the boot count number to Env */
ef_set_env("boot_times", c_new_boot_times);
ef_save_env();
}
/**
* System initialization thread.
*
* @param parameter parameter
*/
void sys_init_thread(void* parameter){
set_system_status(SYSTEM_STATUS_INIT);
/* EasyFlash initialization */
if (easyflash_init() == EF_NO_ERR) {
/* initialize OK and switch to running status */
set_system_status(SYSTEM_STATUS_RUN);
/* test Env demo */
test_env();
} else {
/* initialize fail and switch to fault status */
set_system_status(SYSTEM_STATUS_FAULT);
}
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;
}