一、背景
某些任务想要固定时间进行重复的查询,需要使用定时器来辅助,所以做成了类似RTOS的查询效果,但没有优先级中断抢占,需要任务跑完才能轮到下一个就绪的任务,所以不能随意的使用delay,Task代码也没有vTaskDelay相对/绝对的延迟来使用。
但可以替代在裸机下,使用cnt计数器轮询的情况,可以在基本相同的时间间隔下轮询某一个任务,若能分配好时间,则每个任务可以做到互不干扰。
dmr库在gitee上已经开源了
名字为 : dmr-for-n32
链接 : dmr-for-n32: 针对国民技术的MCU进行标准库封装目前仅对N32G430进行抽象封装
二、搭建工程
随意在example文件夹下找一份示例工程
我使用example\USART\printf工程,将工程复制到桌面
首先先编译一次
然后在工程目录上创建文件夹
将dmr库中的components里面的dmr_nonos文件复制到printf工程中
包含h路径
包含C文件
三、添加代码
#include <stdio.h>
#include "main.h"
#include "dmr_delay.h"
#include "dmr_usart.h"
#include "dmr_nonos.h"
#define TASK_LOOP_TIME 1000 //ms
void SysTick_Handler(void)
{
dmr_nonosAddCnt();
}
void printfTask(void* arg)
{
printf("Hello World\r\n");
}
int main(void)
{
dmr_usartHandle usartHandle = {0};
dmr_nonosTaskHandle printfTaskHandle;
dmr_delayInit();
dmr_usartInit(&usartHandle,DMR_USART1_TX_PA9_RX_PA10,DMR_USART_DEFAULT_CONFIG(115200));
dmr_nonosStaticCreateTask(&printfTaskHandle,TASK_LOOP_TIME,printfTask,NULL);
while (1)
{
dmr_nonosHandler();
}
}
编译之后,会提示SysTick_Handler函数重复,原因是n32g430_it.c里面默认有一个SysTick_Handler,所以屏蔽掉就行了。
之后再编译就通过了。
四、效果
能用