|
复制内容有bsp任意板子的rtconfig.h board.c 文件到 rtt nano目录,复制组件文件夹,头文件夹,源码文件夹,平台先关的libcpu文件夹
极海的这个mcu是M4的平台,的context_rvds 和 cpuport.c
修改地方
/* * Copyright (c) 2006-2019, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-05-24 the first version */ #include <rthw.h> #include <rtthread.h> //添加头文件 #include "apm32f4xx.h" #include "bsp_usart.h" #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) /* * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes */ // 这里是堆得大小 #define RT_HEAP_SIZE (15*1024) static rt_uint8_t rt_heap[RT_HEAP_SIZE]; //获取堆得首地址 RT_WEAK void *rt_heap_begin_get(void) { return rt_heap; } //获取堆得结束地址 RT_WEAK void *rt_heap_end_get(void) { return rt_heap + RT_HEAP_SIZE; } #endif void rt_os_tick_callback(void) { rt_interrupt_enter(); rt_tick_increase();//系统滴答自动增加 rt_interrupt_leave(); } /** * This function will initial your board. */ void rt_hw_board_init(void) { //#error "TODO 1: OS Tick Configuration." /* * TODO 1: OS Tick Configuration * Enable the hardware timer and call the rt_os_tick_callback function * periodically with the frequency RT_TICK_PER_SECOND. */ SystemInit();// (1)系统初始化 SystemCoreClockUpdate();// (2)初始化系统时钟 SysTick_Config(SystemCoreClock/RT_TICK_PER_SECOND); //(3) 滴答定时器初始化 /* Call components board initial (use INIT_BOARD_EXPORT()) */ // INIT_BOARD_EXPORT() 这个宏可以初始化板级外设,如串口,IIC等 #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) //RT_USING_HEAP 打开这个宏就是使能堆,可以动态创建对象 rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); #endif } #ifdef RT_USING_CONSOLE static int uart_init(void) { bsp_uart1_init(115200); return 0; } //板级初始串口,开机后自动调用uart_init函数 INIT_BOARD_EXPORT(uart_init); //(4)添加控制台输出函数 void rt_hw_console_output(const char *str) { rt_size_t size =0; size = rt_strlen(str); for(int i=0;i<size;i++) { if(str=='\n') { /* send a byte of data to the serial port */ USART_TxData(DEBUG_USART, (uint8_t)'\r'); /* wait for the data to be send */ while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET); } /* send a byte of data to the serial port */ USART_TxData(DEBUG_USART, (uint8_t)str); /* wait for the data to be send */ while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET); } } #endif
这里没有改,添加了注释
/* RT-Thread config file */ #ifndef __RTTHREAD_CFG_H__ #define __RTTHREAD_CFG_H__ // <<< Use Configuration Wizard in Context Menu >>> // RT_THREAD_PRIORITY_MAX 这个宏表示 RT-Thread 支持多少个优先级,取值范围为 8~256,默认为 32。 #define RT_THREAD_PRIORITY_MAX 32 //RT_TICK_PER_SECOND 表示操作系统每秒钟有多少个 tick,tick 即是操作系统的时钟周期,默认为 1000 #define RT_TICK_PER_SECOND 1000 // 表示 CPU 处理的数据需要多少个字节对齐,默认为 4 个字节 #define RT_ALIGN_SIZE 4 // 内核对象名字的最大长度,取值范围为 2~16,默认为 8。 #define RT_NAME_MAX 8 // 使用 RT-Thread 组件初始化,默认使能 #define RT_USING_COMPONENTS_INIT // 使用用户 main 函数,默认打开 #define RT_USING_USER_MAIN // main 线程栈大小,取值范围为 1~4086,单位为字节,默认为512。 #define RT_MAIN_THREAD_STACK_SIZE 256 // </h> // 调试配置 // <c1>enable kernel debug configuration // <i>Default: enable kernel debug configuration //#define RT_DEBUG // </c> // <o>enable components initialization debug configuration<0-1> // <i>Default: 0 #define RT_DEBUG_INIT 0 // <c1>thread stack over flow detect // <i> Diable Thread stack over flow detect //#define RT_USING_OVERFLOW_CHECK // </c> // </h> // 钩子函数配置,目前全部关闭。 // <c1>using hook // <i>using hook //#define RT_USING_HOOK // </c> // <c1>using idle hook // <i>using idle hook //#define RT_USING_IDLE_HOOK // </c> // </h> // 软件定时器配置,目前关闭,不使用软件定时器。 #define RT_USING_TIMER_SOFT 0 #if RT_USING_TIMER_SOFT == 0 #undef RT_USING_TIMER_SOFT #endif // <o>The priority level of timer thread <0-31> // <i>Default: 4 #define RT_TIMER_THREAD_PRIO 4 // <o>The stack size of timer thread <0-8192> // <i>Default: 512 #define RT_TIMER_THREAD_STACK_SIZE 512 // </e> // 内部通信配置,包括信号量、互斥量、事件、邮箱和消息队列,根据需要配置 #define RT_USING_SEMAPHORE // 互斥量 //#define RT_USING_MUTEX // 事件 //#define RT_USING_EVENT // 邮箱 #define RT_USING_MAILBOX // 消息队列 //#define RT_USING_MESSAGEQUEUE // </c> // </h> //内存管理配置。 // 这个宏用于表示是否使用内存池,目前关闭,不使用内存池。 //#define RT_USING_MEMPOOL // 于表示是否堆,目前关闭,不使用堆 /* 通过使能或者失能 RT_USING_HEAP 这个宏来选择 使用静态或者动态内存。无论是使用静态还是动态内存方案,使用的都是内部的 SRAM, 区别是使用的内存是在程序编译的时候分配还是在运行的时候分配。 */ #define RT_USING_HEAP #define RT_USING_SMALL_MEM // </c> // <c1>using tiny size of memory // <i>using tiny size of memory //#define RT_USING_TINY_SIZE // </c> // </h> // 控制台配置。控制台即是 rt_kprintf()函数调试输出的设备,通常使用串口 #define RT_USING_CONSOLE //控制台缓存大小 #define RT_CONSOLEBUF_SIZE 256 // </h> //FINSH shell 配置 #include "finsh_config.h" // </c> // </h> // <h>Device Configuration // <c1>using device framework // <i>using device framework //#define RT_USING_DEVICE // </c> // </h> // <<< end of configuration section >>> #endif
static rt_thread_t tid1 = RT_NULL; /* 线程 1 的入口函数 */ static void thread1_entry(void *parameter) { rt_uint32_t count = 0; while (1) { /* 线程 1 采用低优先级运行,一直打印计数值 */ // rt_kprintf("thread1 count: %d\n", count ++); led_toggle(LED1); rt_thread_delay(1000); // led_toggle(LED0); } } #define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 int main(void) { led_init(LED0); led_init(LED1); /* 创建线程 1,名称是 thread1,入口是 thread1_entry*/ tid1 = rt_thread_create("thread1", thread1_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得线程控制块,启动这个线程 */ if (tid1 != RT_NULL) rt_thread_startup(tid1); init_key_btn(); while (1) { rt_thread_mdelay(500); led_toggle(LED0); // rt_kprintf("hello\n") ; key_lib_buttons_process(); } }