野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16891|回复: 1

FreeRTOS移植警告 Warning : #223-D, 创建任务失败求助

[复制链接]
发表于 2020-3-20 22:04:19 | 显示全部楼层 |阅读模式
本帖最后由 liuliangdt 于 2020-3-20 22:12 编辑

之前已经学会了FreeRTOS的一般移植,就开始在任务中使用外部硬件。手里有个MAX6675温度检测芯片,就把例子的代码复制到FreeRTOS里。那个例子是用SPI的方式跟单片机通信的,例子编译下来没有错误跟警告。但把程序下到单片机运行那个例子好像也不对,因为串口助手里没有收到正确的信息。STM32单片机的SPI我还不会,不管怎么说编译没错没警告应该问题不大。移到FreeRTOS后的工程编译后出了个找不到原因的警告。报的是:Warning : #223-D。按理说这个警告应该是比较好解决的,但这是在FreeRTOS中报出来的就不一样了。在网上没找到在FreeRTOS中报Warning : #223-D的帖子,下面是编译完后的样子。

截图-21.jpg

就是这样,我以为可能是SPI配置不对,我也找不到解决的办法又没有错误,就把程序下载到单片机上运行试试看什么效果。MAX6675任务里没有任何消息打印出来,然后改成从创建任务开始每个过程都打印消息。这才发现原来连任务都没有创建成功。

截图-23.jpg

之前想都没有想过还有任务创建失败的事,野火教程例子里也只有  AppTaskCreate  函数才做了任务创建是否成功的判断。下面的图片是输出消息的地方。

截图-20.jpg

真的又无语了,又不知道错在哪里了。我认为还是SPI的配置出问题的。SPI的配置是直接复制 MAX6675 例子,我目前还不懂请大神帮我看看SPI配置有什么问题没有?谢谢!

截图-22.jpg

下面是SPI配置的源代码:

[mw_shl_code=c,true]/*STM32F103头文件*/
#include "stm32f10x.h"

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"

#include "stm32f10x_spi.h"
#include "stm32f10x_rcc.h"

#include "max6675.h"

/*
* 函数名:SPI1_Init
* 描述  ?MAX6675 接口初始化
* 输入  :无
* 输出  :无
* 返回  :无
*/                                            
void SPI_MAX6675_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
   
  /* 使能 SPI1 时钟 */                        
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);

  /* ---------通信I/O初始化----------------
   * PA5-SPI1-SCK :MAX6675_SCK
   * PA6-SPI1-MISO:MAX6675_SO
   * PA7-SPI1-MOSI:MAX6675_SI  
   */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     // 复用输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* ---------控制I/O初始化----------------*/
  /* PA4-SPI1-NSS:MAX6675_CS */             // 片选
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    // 推免输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);              
  GPIO_SetBits(GPIOA, GPIO_Pin_4);            // 先把片选拉高,真正用的时候再拉低
  

  /* SPI1 配置 */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
   
   
  /* 使能 SPI1  */
  SPI_Cmd(SPI1, ENABLE);
}[/mw_shl_code]



回复

使用道具 举报

 楼主| 发表于 2020-3-21 15:48:00 | 显示全部楼层
已经找到问题的原因,是因为FreeRTOS的总堆栈分配小,将总堆申请改大就好了。
思路是这样的:
开始我是怀疑SPI配置不对造成的,于是就把MAX6675_Task任务的所有内容删了,就剩个空函数。编译0错误0警告,下载到单片机。出乎意料,串口助手打印的消息还是MAX6675_Task任务创建失败。我看着串口助手打印出来的消息,总共创建5个任务。4个创建成功,1个失败,会不会是创建的任务多了?于是我就把KEY_Task任务屏蔽,这样一共就只有4个任务,编译后下载到单片机。惊!串口助手打印的消息显示MAX6675_Task任务创建成功。
于是就知道了真的是任务创建个数过多造成的。便改搜索词为“freertos 建立任务超过几个后系统不能运行”,得到了这个帖子:
freertos 建立任务超过几个后系统不能能运行
里面说的是堆分配不当,会导致的问题。一同出现在搜索页面的还有这个帖子:
FreeRtos新建任务不能运行
直接给出答案:
把#define configTOTAL_HEAP_SIZE 从15k改到48k就可以( ( size_t ) ( 48 * 1024 ) ) //15*1024
操作系统堆栈太小
之前我是已经将:#define configTOTAL_HEAP_SIZE  ( ( size_t ) ( 36 * 1024 ) )  改成了  #define configTOTAL_HEAP_SIZE  ( ( size_t ) ( 10* 1024 ) )
参见:  FreeRTOS移植到STM32F103C8不进main.c求助
把: #define configTOTAL_HEAP_SIZE  ( ( size_t ) ( 10 * 1024 ) )  改成了  #define configTOTAL_HEAP_SIZE  ( ( size_t ) ( 18* 1024 ) )  后将工程中目前所有的5个任务添加后编译。终于0错误0警告了,下载程序到单片机。窗口助手打印的消息显示所有的5个任务都创建成功。
后来我又把例子中的SPI功能有配置好,试一下是不是好的。喜!原来SPI的功能没问题,MAX6675能正常的跟单片机通信。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-26 05:50 , Processed in 0.031019 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表