没有提到的是要把系统时钟源换一下,可以换到定时器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可以,超级终端和串口助手的区别 超级终端