最近在移植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值。
请问大家有没有遇到过这样的情况,请大家赐教!谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>