此内容由EEWORLD论坛网友tinnu原创,如需转载或用于商业用途需征得作者同意并注明出处
原本以为freertos移植挺简单的,结果一下就被打脸了。
与常见的freertos移植不同,ti例程里面移植没有使用systick定时器(可能在汇编文件里面使用了,我没看出来)这导致我完全无法像在st和nxp平台那样顺手,只能完全按着例程来……毕竟人家使用的时基是什么都不知道,就更别说自己捣鼓了。
移植的工程完全按照例程里面的freertos_demo来:
1、include选项卡设置:
2、加入库:
如果不想用官方给你做好的freertos库,可以加入以下文件,经过验证,这些文件的效果和.a库是一样的,虽然都不能成功运行,但编译没有错误,运行都是卡在vApplicationMallocFailedHook这个内存分配的钩子函数里面:
3、全局声明
4、工程目录文件
mian是使用freertos_demo的例程,这个例程对于套件例程和官方的launchpad例程是一样的
能够正常初始化,但一旦调用了os相关的函数:
- osi_MsgQCreate(&MsgQ, "MSGQ", MAX_MSG_LENGTH, 10);
或者xTaskCreate初始化创建任务并分配内存的函数,就会进入vApplicationMallocFailedHook这个钩子函数。
- void vApplicationMallocFailedHook()
- {
- //Handle Memory Allocation Errors
- while(1)
- {
- }
- }
由于钩子函数vApplicationMallocFailedHook主要是针对内存分配出错,所以尝试过调大configTOTAL_HEAP_SIZE和各个任务的堆栈,但都无补于事
由于无论调用什么内存分配函数都会产生内存分配的错误,初步怀疑是freertos+ccs的例程在内存分配上有问题。ccs一般都是配合ti_rtos的,freertos趟坑的人少,本身存在bug也不奇怪。
不过也只是猜想而已,本身freertos的功底小半桶水见底,连时基怎么产生的也没看出来:
1、用ctrl+H搜过systick相关字符,真的一个函数都没有
2、也没有发现有哪里调用了xPortSysTickHandler
3、也没发现调用了其他定时器