使用cubemx移植RT-Thread Nano

245 阅读2分钟

参考

没有提到的是要把系统时钟源换一下,可以换到定时器1或其它,因为系统时钟被RTT用了,会冲突

点击跳转时下图问题,.s文件是组合语言源代码,汇编居多,一般是C编译产生的中间代码  关于context_rvds.s参考

解决方法:把文件类型换成二进制格式再编译一下

注意在board.c上除了添加#include "main.h" 还要添加extern void SystemClock_Config(void);

关于动态线程和静态线程 参考

关于时间片和线程优先级

如果在主线程main里面创建线程,要把while循环去掉或者在里面添加rt_thread_mdelay()延时函数,否则不能正常运行其它线程,一直while

如果要动态创建线程,要定义RT_USING_HEAP  默认不定义  定义后根据需要要改一下RT_HEAP_SIZE大小

线程的几个状态

/* USER CODE BEGIN PV */
/* 栈空间地址对齐 */
ALIGN( RT_ALIGN_SIZE )
/* 定义一个数组,栈的空间大小就是1024*8字节 */
rt_uint8_t rt_led1_thread_stack[1024];
/* 初始化线程栈 */
struct rt_thread rt_led1_thread;

rt_uint8_t rt_led2_thread_stack[1024];
/* 定义线程控制块指针 */
rt_thread_t rt_led2_thread = RT_NULL;
/* USER CODE END PV */

//编写静态线程入口函数
void led1_thread_entry(void *parameter)
{
	while(1)
	{
	    HAL_GPIO_TogglePin(led6_link_GPIO_Port,led6_link_Pin);
	    rt_thread_mdelay(1000);
	}
}
 
//编写动态线程入口函数
void led2_thread_entry(void *parameter)
{
	while(1)
	{
	    HAL_GPIO_TogglePin(led5_data_GPIO_Port,led5_data_Pin);
	    rt_thread_mdelay(100);
	}
} 

int main(void)
{
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  /**************************** 静态创建 **************************************/
  rt_err_t rst_led1;
  rst_led1 = rt_thread_init(&rt_led1_thread,
						"led1line",
						led1_thread_entry,
						RT_NULL,
						&rt_led1_thread_stack[0],
						sizeof(rt_led1_thread_stack),
						RT_THREAD_PRIORITY_MAX-2,
						20);
  if(rst_led1 == RT_EOK)
  {
		rt_thread_startup(&rt_led1_thread);
  }
  /***************************** 动态创建 ******************************************/
	rt_led2_thread = rt_thread_create( "led2line",
								      led2_thread_entry,
								      RT_NULL,
								      sizeof(rt_led2_thread_stack),
								      RT_THREAD_PRIORITY_MAX-3,
								      20);
	if( rt_led2_thread != RT_NULL )
		/* rt_thread_startup() 的形参是一个线程控制块指针,动态创建线程时返回的就是线程控制块指针,所以直接传入即可 */
		rt_thread_startup( rt_led2_thread );
	else
		return -1;								
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	rt_thread_mdelay(1000);
	
  }
  /* USER CODE END 3 */
}

串口移植中ch = huart1.Instance->DR & 0xff; 在L4的HAL库中没有DR,写成RDR

移植FinSH后,用串口助手发指令没反应,用Xshell可以,超级终端和串口助手的区别  超级终端