本帖最后由 BinWin 于 2021-6-8 22:36 编辑
很幸运得到ART-Pi的评测机会,废话不多说,直接开始上电使用。
可以看得出板卡是其他朋友使用过的,资源共享嘛,没毛病就行。附送的数据线可能造成接触不良,更换后完美了。接下来就使用MDK创建一个RTX的工程吧。MDK的RTE环境极为便捷,点点鼠标工程就出来了。如下图,选择ARM封装的CMSIS RTOS V2,STM32的HAL库组件。Resolve一下,正常情况下就可以编译一下了。
一般情况下 void SVC_Handler(void),void PendSV_Handler(void),void SysTick_Handler(void) 这三个中断函数会和RTOS的定义重复,注释即可。另外要记得HAL库的时间基准模式是滴答时钟,注释掉SysTick_Handler()函数后,HAL库的调用会出问题。解决方法就是使用一个硬件定时器做时基即可,如下图,CubeMX的配置
这些事情做完以后,可以来测试下了,点灯之路,工程师必备绝技。如果时基不搞对,HAL_Delay()会出错的。
接下来添加RTX的线程函数,这里创建两个线程,一个是LED闪烁,用来做各种状态的提示功能,一个是网络任务,预留函数,使用LED替代。关键代码如下内容
const osThreadAttr_t ThreadLED_Attr =
{
.name = "osRtxLEDThread",
.attr_bits = osThreadDetached,
.priority = osPriorityHigh1,
.stack_size = 512,
};
const osThreadAttr_t ThreadNET_Attr =
{
.name = "osRtxNETThread",
.attr_bits = osThreadDetached,
.priority = osPriorityHigh2,
.stack_size = 512,
};
osThreadId_t ThreadIdTaskNET = NULL;
osThreadId_t ThreadIdTaskLED = NULL;
void AppTaskLED(void *argument)
{
const uint16_t usFrequency = 500;
uint32_t tick;
tick = osKernelGetTickCount();
while(1)
{
HAL_GPIO_TogglePin(LED_B_GPIO_Port,LED_B_Pin);
tick += usFrequency;
osDelayUntil(tick);
}
}
void AppTaskNET(void *argument)
{
while(1)
{
HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin);
osDelay(200);
}
}
osKernelInitialize();
ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);
ThreadIdTaskNET = osThreadNew(AppTaskNET, NULL, &ThreadNET_Attr);
osKernelStart();
此时编译下载,任务便直接运行了。首次上电就记录到这里。
|