关于F429+FreeRTOS+emWin+TTF移植问题

2019-07-20 01:25发布

最近在移植TTF字体的时候遇到个问题,还请大家赐教!
开发环境:
        [MCU] STM32F429IGT6
        [OS] FreeRTOS
        [GUI] emWin 5.30
        [FS] Fatfs
        [TTF包] freetype 5.26
        [RAM] 外部扩展SDRAM
说明:因为为下载到与emWin版本相匹配的TTF包,故暂时先采用5.26版本进行调试,对此还不知道是否存在影响?
=========================================================================
        将TTF移植完成后,在SD卡中放入一个测试用ttf字体库,并在工程的初始化部分调用创建字体函数(代码如下):

        res = Create_TTFFont((u8 *)"0:calibri.ttf");
        if (res) {
            printf("TTF字体创建失败,%d ", res);
       }
      else {
           printf("TTF字体创建成功,%d ", res);
      }

//---------------------------------------------------------------------------------------
       int Create_TTFFont(u8 *fxpath)
       {
            int result;
            u16 bread;
            char *TtfBuffer;

#if SYSTEM_SUPPORT_OS
//        CPU_SR_ALLOC();
#endif

          result = f_open(&TTFFontFile, (const TCHAR*)fxpath, FA_READ); //打开字库文件
          if (result != FR_OK) {
               return 1;
          }

         TtfBuffer = mymalloc(SRAMEX, TTFFontFile.obj.objsize);//申请内存
         if (TtfBuffer == NULL) {
             return 3;//内存申请失败
         }

//读取字体数据
#if SYSTEM_SUPPORT_OS
         taskENTER_CRITICAL();
#endif
   
         result = f_read(&TTFFontFile, TtfBuffer, TTFFontFile.obj.objsize, (UINT *)&bread); //读取数据
         if (result != FR_OK) {
             return 4; //文件打开失败,跳出
         }

         f_close(&TTFFontFile); //关闭TTFFointFile文件
   
#if SYSTEM_SUPPORT_OS
         taskEXIT_CRITICAL();
#endif

         TTFData.pData = TtfBuffer; //指向文件地址
         TTFData.NumBytes = TTFFontFile.obj.objsize; //文件大小

        Cs0.pTTF  = &TTFData;
        Cs0.PixelHeight = 12;
        Cs0.FaceIndex = 0;

        Cs1.pTTF  = &TTFData;
        Cs1.PixelHeight = 18;
       Cs1.FaceIndex = 0;

       Cs2.pTTF  = &TTFData;
       Cs2.PixelHeight = 24;
       Cs2.FaceIndex = 0;

       Cs3.pTTF  = &TTFData;
       Cs3.PixelHeight = 36;
       Cs3.FaceIndex = 0;

       result = GUI_TTF_CreateFont(&TTF12_Font, &Cs0); //创建字体
       if (result) {
            return 5; //字体创建失败
       }
       result = GUI_TTF_CreateFont(&TTF18_Font, &Cs1); //创建字体
       if (result) {
            return 6; //字体创建失败
       }
       result = GUI_TTF_CreateFont(&TTF24_Font, &Cs2); //创建字体
       if (result) {
            return 7; //字体创建失败
       }
       result = GUI_TTF_CreateFont(&TTF36_Font, &Cs3); //创建字体
       if (result) {
           return 8; //字体创建失败
       }
      return 0;
  }

上述代码是从uCos系统下移植过来的,对函数中预编译宏进行了替换。

运行时,串口出现错误如下信息,程序阻塞。
Error:..FreeRTOSqueue.c,1244
Error:..FreeRTOSqueue.c,1245

对应代码是在“queue.c”文件中的断言部分

BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking )
{
       BaseType_t xEntryTimeSet = pdFALSE;
       TimeOut_t xTimeOut;
       int8_t *pcOriginalReadPosition;
       Queue_t * const pxQueue = ( Queue_t * ) xQueue;
       configASSERT( pxQueue );
       configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );

#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
{
       configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
}
#endif
      ......
}

通过debug,函数Create_TTFFont()文件数据读写都正常,程序卡在第一条“result = GUI_TTF_CreateFont(&TTF12_Font, &Cs0);”处,在xQueueGenericReceive函数中,被断言的内容pxQueue为0值。

请问大家有没有遇到过这样的情况,请大家赐教!谢谢!




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。