【STM32】FreeRTOS踩坑

1.在FreeRTOS内核启动前(即osKernelStart()函数前),千万不能使用osDelay()来延时,否则会发生硬件错误

int main(void)
{
  ...
  /* Init scheduler */
  osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init();
  
  /* Start scheduler */
  osKernelStart();
  while1{
  
  }
  ...
}

2.使用常用公共资源时,该加锁的加锁,否则直接卡死,尤其像串口打印LOG这种会在多个任务中频繁使用的

(1)串口重定向

/*多任务打印,加互斥锁*/
extern osMutexId_t printMutexHandle;
//重定向
int fputc(int ch, FILE *f)
{
	osSemaphoreAcquire( printMutexHandle, portMAX_DELAY );//加锁
	{
		HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xFFFF);
	}
	osSemaphoreRelease( printMutexHandle );//解锁  			
	return (ch);
}

(2)IIC通信

static HAL_StatusTypeDef I2Cx_ReadMultiple(I2C_HandleTypeDef* I2Cx_HandleStruct,\
                                           uint8_t Addr,\
                                           uint16_t Reg,\
                                           uint16_t MemAddress, \
                                           uint8_t *Buffer,\
                                           uint16_t Length)
{
	osSemaphoreAcquire( eepromMutexHandle, portMAX_DELAY );//加锁

    HAL_StatusTypeDef status = HAL_TIMEOUT;
    
    status = HAL_I2C_Mem_Read(I2Cx_HandleStruct, Addr, (uint16_t)Reg, MemAddress, Buffer, Length, I2C_TIMEOUT);
    
    /* Check the communication status */
    if(status != HAL_OK)
    {
        /* I2C error occured */
        if(I2Cx_HandleStruct->Instance == I2C1)
        {
            I2C1_Error();
        }
        else
        {
            I2C2_Error();
        }
    }
    osSemaphoreRelease( eepromMutexHandle ); //解锁
    return status;    
}
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用FreeRTOSSTM32上开发需要进行以下步骤: 1. 下载安装FreeRTOS:从FreeRTOS官网上下载最新的FreeRTOS版本,并将其解压缩到您的工程目录下。 2. 配置FreeRTOSFreeRTOS配置文件 `FreeRTOSConfig.h` 定义了FreeRTOS内核的参数和特性,您可以根据自己的需求进行配置。例如,您可以配置堆栈大小、任务数、时间片大小等。在配置文件中还需要指定处理器类型,以便FreeRTOS正确地使用处理器上的硬件资源。 3. 集成FreeRTOS:将FreeRTOS源文件添加到您的工程中。您可以选择使用FreeRTOS提供的makefile或IDE工程文件,或者手动将源文件添加到您的工程中。 4. 创建FreeRTOS任务:在您的主函数中创建任务。每个任务都是一个无限循环,在任务中执行您想要的操作。任务可以是周期性的或事件驱动的,具体取决于您的需求。创建任务时,需要指定任务优先级、堆栈大小等参数。 5. 启动FreeRTOS调度器:在创建完任务后,需要调用FreeRTOS的调度器函数以启动任务调度。调度器会按照任务优先级和调度算法(例如轮询、抢占式等)来调度任务。 6. 编写任务代码:为每个任务编写代码,使其能够完成其所需的操作。任务可以使用FreeRTOS提供的API函数来进行同步、通信和资源管理等操作。 这些是在STM32上使用FreeRTOS的基本步骤。但是需要注意的是,FreeRTOS的使用需要一定的RTOS和嵌入式系统开发经验,建议在学习之前对相关知识有一定的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外来务工人员徐某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值