#include "rtthread.h"
#include "rtconfig.h"
这两个头文件,
board.c里定义rt_hw_board_init 这个函数如下:
void rt_hw_board_init(void)
{
HAL_Init(); //HAL库初始化
Stm32_Clock_Init(RCC_PLL_MUL9); //设置主频
LED_Init(); //外设
}
这里打开rt_config.h,
注释掉:
#define RT_USING_HEAP
就会使用静态内存空间(记得保存再编译)。
在操作系统中滴答定时器作为心跳包提供系统时间,所以任何操作系统都会使用到滴答定时器。Systick time
SysTick_Config(SystemCoreClock);
void SysTick_Handler(void)
{
}
SysTick_Config(SystemCoreClock/5);
大概200ms进入一次中断
SysTick_Config(SystemCoreClock/RT_TICK_PER_SECOND);
后面这个变量是个宏定义,可以跳转查看,我这里是1000
void SysTick_Handler(void)
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
#include "rtthread.h"
#include "rtconfig.h"
这两个头文件,然后在while1里可以写一个灯闪烁,延迟函数用RT库的,
rt_thread_delay();
参数填RT_TICK_PER_SECOND,正好是1s的延迟,如下:
LED=~LED;
rt_thread_delay(RT_TICK_PER_SECOND);
就是这样,可以实现1s的闪烁,如果正常闪烁,说明时钟配置完成。
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data));
/* Transmit Data */
USARTx->DR = (Data & (uint16_t)0x01FF);
}
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
USART_SendData(pUSARTx,ch);
while ((USART1->SR&0X40)==0);
}
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
unsigned int k=0;
do
{
Usart_SendByte( pUSARTx, *(str + k) );
k++;
} while(*(str + k)!='\0');
while((USART1->SR&0X40)==0)
}
这个函数移植到串口文件里,然后在串口头文件里声明
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
这个函数,后面要调用。
定义这个函数,
void rt_hw_console_output(const char *str)
{
Usart_SendString( USART1,(char *)str);
}
然后打开串口重启,你就能看到RT_Thread的LOGO和控制台了,它可以像命令行一样使用哦。
static uint8_t heap_buf[10*1024];
rt_system_heap_init(heap_buf,heap_buf+sizeof(heap_buf)-1);
初始化动态内存。
在主函数开始的位置,
rt_thread_t tid; //开辟一个新线程
/*函数参数,1.线程名字,2.线程入口函数名,3.线程入口参数 4.线程栈大小 5.线程优先级 6.线程tick数*/
tid=rt_thread_create("task1" ,rt_task1 ,RT_NULL ,200 ,7 ,1);
void rt_task1(void *parameter)
{
while(1)
{
LED0=0;
rt_thread_delay(RT_TICK_PER_SECOND);
}
}
if(tid !=RT_NULL)
{
rt_thread_startup(tid);
}
else
{
rt_kprintf("thread1 create fail");
}