1.GPIO是什么?
通用输入输出接口
2.VCC是什么?VCC通常是多少V?
VCC是电源,VCC通常是3.3伏或者5伏
3.FreeRTOS任务有几种状态,分别是什么状态?
四种状态:创建态,运行态,阻塞态,挂起态
4.PWM是什么?
脉冲调制,用来调节电压
5.占空比是什么?
高电平时间/整个周期时间的比例
6.FreeRTOS是什么?
FreeRTOS是开源的实时的操作系统
7.FreeRTOS和Linux的区别?
内存上:FreeRTOS占用的空间比较小,Linux占用的空间大。
应用上:FreeRTOS应用在嵌入式系统,Linux应用在嵌入式系统,也可应用于桌面系统
性能上:FreeRTOS没有Linux操作系统性能强。
FreeRTOS是实时操作系统,Linux是通用操作系统
8.描述一下串口的数据帧格式?
数据位,起始位,校验位,停止位
9.定时器的定时时间怎么计算?
(预分频系数+1)*(重装载值+1)/48M
10.ADC是什么?
模拟数字转换器,模拟信号是连续的信号,数字信号是不连续的信号
11.FreeRTOS创建任务有几种方式
静态创建和动态创建
12.串口中的波特率是什么?波特率设置有没有需要注意的?
波特率表示数据的传输速度,波特率越大传输的效率越快,需要注意的是单片机的波特率要和电脑设置一致。
13.DMA是什么?
直接存储器存储设备。使用DMA可以减轻CPU的负担,提升CPU的资源利用率。DMA传输数据比较快,适用于处理图片、视频、音频等数据量较大的场合。
14.任务的挂起和任务的删除有什么区别?
任务挂起:任务还存在,但是不执行
任务删除:删除任务,任务不存在。
15.说一下FreeRTOS有哪几种调度算法?
时间片轮询调度,协作式调度,抢占式调度
=============================================
1.总结任务调度算法之间的区别,重新实现一遍任务调度算法的代码。
抢占式任务调试
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop *///osDelay(4000);int i=0;for(;;){ printf("StartDdfaultTask is start\r\n");if(myTask02Handle==NULL){myTask02Handle=osThreadNew(StartTask02,NULL,&myTask02_attributes);}printf("StartDdfaultTask is end\r\n");osDelay(500);}/* USER CODE END StartDefaultTask */
}/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */osDelay(4000);for(;;){printf("StartTask02\r\n");osDelay(500);}/* USER CODE END StartTask02 */
}
时间片轮询式调度
void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop *///osDelay(4000);int i=0;for(;;){ printf("StartDdfaultTask is start\r\n");for(i=0;i<10000000;i++){;}printf("StartDdfaultTask is end\r\n");osDelay(500);}/* USER CODE END StartDefaultTask */
}/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */osDelay(4000);for(;;){printf("StartTask02\r\n");osDelay(500);}/* USER CODE END StartTask02 */
}
2.总结静态创建任务和动态创建任务的区别,以及动态创建任务和静态创建任务的源码分析步骤
动态创建任务不需要主动提供栈的空间,静态创建任务需要提前提供栈的空间。
动态可以随时创建,随时删除,静态创建任务无法随时创建,随时删除。
动态创建任务更加灵活消耗CPU的资源比较多,静态创建任务消耗资源少
3.总结任务的状态,以及任务状态之间的转换关系。
Ready:当任务被创建出来后就会进入到就绪态
Running:当任务正在执行就是运行态
Blocked:等待某一个事件
Suspended:任务被挂起,无法执行,但是任务还是存在
Ready->Running:当调度器选择了当前任务,让当前任务的代码执行。
Running->Ready:当任务执行结束后,重新进入就绪态