0.裸机工程准备
串口工程创建
参考:
printf重定向
在usart.c的最后,将printf重定向到串口1:
/* USER CODE BEGIN 1 */
#if 1
#include <stdio.h>
int fputc(int ch, FILE *stream)
{
/* 堵塞判断串口是否发送完成 */
while((USART1->ISR & 0X40) == 0);
/* 串口发送完成,将该字符发送 */
USART1->TDR = (uint8_t) ch;
return ch;
}
#endif
/* USER CODE END 1 */
1.移植内核
1.1. 添加到工程中
复制源码中内核相关的文件夹到裸机工程:
再把tos_config.h文件也复制过来:
添加内核源码到MDK工程中:
添加头文件路径:
此时编译工程应该没有问题,如果有问题,检查文件是否添加正确。
1.2. 修改适配
屏蔽掉原有的PendSVhandler,防止冲突:
修改原有的systick中断服务函数,添加tencentOS-tiny的时基信号:
至此,tencentOS-kernel内核移植完毕,接下来测试内核是否可以正常使用。
2. 创建两个任务
编辑main.c文件。
包含进来头文件:
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <tos_k.h>
/* USER CODE END Includes */
编写任务栈,任务控制块,任务入口函数:
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
k_task_t task1;
k_task_t task2;
k_stack_t task1_stack[256];
k_stack_t task2_stack[256];
void task1_entry(void *arg)
{
while(1)
{
printf("task1 is running...\r\n");
tos_task_delay(1000);
}
}
void task2_entry(void *arg)
{
while(1)
{
printf("task2 is running...\r\n");
tos_task_delay(1000);
}
}
/* USER CODE END 0 */
在main函数中初始化内核、创建任务、启动内核:
/* USER CODE BEGIN 2 */
printf("TencentOS-tiny Port on BearPi By Mculover666\r\n");
//初始化内核
tos_knl_init();
//创建任务
tos_task_create(&task1, "task1", task1_entry, NULL, 2, task1_stack, sizeof(task1_stack), 10);
tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stack, sizeof(task2_stack), 10);
//启动内核
tos_knl_start();
/* USER CODE END 2 */
3. 实验结果
移植成功。