移植TencentOS-tiny内核调度器到裸机工程的方法

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. 实验结果

移植成功。

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/106547671