上一篇文章是看完速通课程,但是感觉学的有点虚,所以补一补

对于FreeRTOS多线程的引入,就是,你可以去尝试一下用不同频率去闪烁LED灯,配上定时器代码会非常臃肿,但是使用FreeRTOS多线程操作就会非常,简洁。下面会展示FreeRTOS的版本,读者可以自己尝试使用定时器的方式去写

一般在CubeMX里基础配置就是这样

1.Cmsis文件是用来生成一个统一的接口,自动对于不统独底层的操作系统使用不同的任务函数

可以自己创建FreeRTOS任务函数,就是

BaseType_t      xTaskCreate(函数,名字,栈深度,函数参数,优先级,句柄,)

BaseType_t xTaskCreate(函数,名字,栈深度,函数参数,优先级,句柄,)

xTaskCreate(MyTask,"Myself",128,NULL,osPriorityNormal,NULL);


void MyTask(void *argument) 
{
	while(1)
	{
		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);
		vTaskDelay(500);
	}
}

void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
	  HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
    osDelay(1000);
  }
  /* USER CODE END StartDefaultTask */
}

这就是用1S和0.5S去闪烁两个LED真的已经很便利的,甚者这里创建任务的代码也可以在CubeMX里面直接配置

如果想要了解一些程序的底层逻辑就必须要学会,去看他的汇编原码,毕竟不管什么语言都是先翻译程汇编机器才能看懂

看汇编语言的方法有很多,我用的Keil,直接在Debug里打开汇编窗口,但是方法肯定不止这一招,可以去网上查一查,这里就不赘述了

介绍一些简单的汇编指令

这里名词可能不当 , 但是实质就是,机器看到的是机器码,翻译成汇编语言出来就是 指令+参数的形式

1读内存 :    Load      LDR是读4个字节   LDRB 一个字节  LDRH读2个字节

示例:

LDR  R0 , [R1,#4] ; //读取地址“R1+4”,将得到的4个字节数据存到R0

2 写内存 :     Stroe    同理  STR 4个字节 STRB 1个字节  STRH  2个字节

示例 :

STR   R0 , [R1,#4] ; //把R0的4个字节数据写到地址“R1+4”

3 加减:

ADD R0 , R1 , R2 ;  // R0 = R1+R2

ADD R0 ,R0 ,#1    // R0 = R0+1

SUB  R0 , R1 , R2 ;  // R0 = R1-R2

SUB  R0 ,R0 ,#1    // R0 = R0-1

4比较

CMP R0 , R1 ; //结果存储在PSR寄存器里(程序状态寄存器)

5跳转

B   main ; //Branch,直接跳转//直接进入main函数

BL  main ; // Branch and Link ,先把返回地址保存在LR寄存器里再跳转

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐