他的回复:
这个问题终于搞定了,经过一步一步仿真,没一步都查看变量值,发现Huawei_LiteOS和Huawei_LiteOS_Kernel实现方式不一样的,将Huawei_LiteOS出错的地方,改成Huawei_LiteOS_Kernel一样实现方式就可以了, 话不多说直接给出要改动的地方,立竿见影!!第一个地方:kernel\base\core内的los_task.c,功能函数UINT32 osTaskInit(VOID)改成如下:/***************************************************************************** Function : osTaskInit Description : Task init function. Input : None Output : None Return : LOS_OK on success or error code on failure *****************************************************************************/ extern UINT8 *m_aucSysMem0;////按照Kernel版本方法//los_init.c已经定义 m_aucSysMem0//// UINT8 g_ucMemStart[OS_SYS_MEM_SIZE];////按照Kernel版本的用法//// LITE_OS_SEC_TEXT_INIT UINT32 osTaskInit(VOID) { UINT32 uwSize; UINT32 uwIndex; LOS_DL_LIST *pstListObject; m_aucSysMem0 = g_ucMemStart;////按照其他版本,新加的//// uwSize = (g_uwTskMaxNum + 1) * sizeof(LOS_TASK_CB); g_pstTaskCBArray = (LOS_TASK_CB *)LOS_MemAlloc(m_aucSysMem0, uwSize); if (NULL == g_pstTaskCBArray) { return LOS_ERRNO_TSK_NO_MEMORY;//没有内存!! } (VOID)memset(g_pstTaskCBArray, 0, uwSize); LOS_ListInit(&g_stTaskTimerList); LOS_ListInit(&g_stLosFreeTask); LOS_ListInit(&g_stTskRecyleList); for (uwIndex = 0; uwIndex = LOSCFG_BASE_CORE_TSK_LIMIT; uwIndex++) { g_pstTaskCBArray[uwIndex].usTaskStatus = OS_TASK_STATUS_UNUSED; g_pstTaskCBArray[uwIndex].uwTaskID = uwIndex; LOS_ListTailInsert(&g_stLosFreeTask, &g_pstTaskCBArray[uwIndex].stPendList); } (VOID)memset((VOID *)(&g_stLosTask), 0, sizeof(g_stLosTask)); g_stLosTask.pstRunTask = &g_pstTaskCBArray[g_uwTskMaxNum]; g_stLosTask.pstRunTask->uwTaskID = uwIndex; g_stLosTask.pstRunTask->usTaskStatus = (OS_TASK_STATUS_UNUSED | OS_TASK_STATUS_RUNNING); g_stLosTask.pstRunTask->usPriority = OS_TASK_PRIORITY_LOWEST + 1; osPriqueueInit(); uwSize = sizeof(LOS_DL_LIST) * OS_TSK_SORTLINK_LEN; pstListObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, uwSize); if (NULL == pstListObject) { return LOS_ERRNO_TSK_NO_MEMORY; } (VOID)memset((VOID *)pstListObject, 0, uwSize); g_stTskSortLink.pstSortLink = pstListObject; g_stTskSortLink.usCursor = 0; for (uwIndex = 0; uwIndex OS_TSK_SORTLINK_LEN; uwIndex++, pstListObject++) { LOS_ListInit(pstListObject); } #if ((LOSCFG_PLATFORM_EXC == YES) && (LOSCFG_SAVE_EXC_INFO == YES)) osExcRegister((EXC_INFO_TYPE)OS_EXC_TYPE_TSK, (EXC_INFO_SAVE_CALLBACK)LOS_TaskInfoGet, &g_uwTskMaxNum); #endif #if (LOSCFG_LIB_LIBC_NEWLIB_REENT == YES) extern LITE_OS_SEC_TEXT VOID osTaskSwitchImpurePtr(VOID); g_pfnTskSwitchImpurePtrHook = osTaskSwitchImpurePtr; #endif return LOS_OK; }如 上所示,带有////就是已更改的地方,于是用IAR进行编译,发现报错了哈哈,IAR不接受太复杂的表达式,打开target_config.h,在LINE:384找到OS_SYS_MEM_SIZE/** * @ingroup los_config * Size of LiteOS heap memory */ //常量表达式太复杂,IAR会报错 #define OS_SYS_MEM_SIZE (UINT32)((UINT32)LOS_HEAP_MEM_END - (UINT32)LOS_HEAP_MEM_BEGIN)我们将这个表达进行展开,发现真是太复杂了,哈哈。在GCC里面可能不会有问题,但在IAR里面就是不会让你编译通过,于是我们机械的改一下,只要附合芯片的内存大小就行,不过如果不准确的话,就会使内存得不到用,白白浪费掉!!比如WINDOWS是32bit的,只能识别到4G内存一样,就算你装个32G内存也是4G。/** * @ingroup los_config * Size of LiteOS heap memory */ #define OS_SYS_MEM_SIZE 0x9999//0x00008000改好后,我们再进行编译发现OK了Huawei_LiteOS这个测试是M3的,STM32F103VET6的芯片。Huawei_LiteOS_Kernel之前测试的,是M4的,STM32F411RET6的芯片,这个在测UART2时发现奇怪的跑飞BUG.哪我就用这个Huawei_LiteOS+STM32F103VET6在IAR,再试一下这个奇怪的BUG,首先在MAIN.C中,增加串口打印的代码:////////////////////////////////////////////////////////////////// //加入以下代码,支持printf函数 #include #include //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART2->SR&0X40)==0);//循环发送,等上次的发送完毕! USART2->DR = (unsigned char) ch; return ch; } ///////////////////////////////////配置UARTx//////////////////////////////////// void USARTx_Config(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);// 打开串口2的外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 打开串口1的外设时钟 //6个参数设置 USART_InitTypeDef USART_InitStructure = { 115200, //串口2波特率设置 USART_WordLength_8b, //数据长8BIT,原形是((uint16_t)0x0000) USART_StopBits_2, //停止位是2BIT USART_Parity_No, //无校验位 USART_Mode_Tx, //TX发模式 USART_HardwareFlowControl_None };//硬件流控制NONE USART_Init(USART2, &USART_InitStructure); //将6个参数初始化到串口2 USART_Cmd(USART2, ENABLE); //配好后打开串口2外设, USART_ITConfig(USART2, USART_IT_TC,DISABLE); //用了DMA中断了,关掉UART2的中断,RA2为TX引脚。 USART_Init(USART1, &USART_InitStructure); //将6个参数初始化到串口1 USART_Cmd(USART1, ENABLE); //配好后打开串口1外设, USART_ITConfig(USART1, USART_IT_TC,DISABLE); //用了DMA中断了,关掉UART2的中断,RA2为TX引脚。 /*--------------------UART1 UART2要用的引脚----------------------*/ //PA3是RX2引脚,PA10是RX1引脚 GPIO_InitTypeDef GPIO_InitStructure2 = { GPIO_Pin_3|GPIO_Pin_10, //1 参数PIN3 PA3是UART2的RX引脚 ,PA10是UART1的RX GPIO_Speed_10MHz, //2 参数2M速度 GPIO_Mode_IN_FLOATING }; //3 参数浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure2); __NOP(); //RA2是打印printf功能,RA9是普通的串口1 ,TX1功能。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //0 打开GPIOA的外设时钟 GPIO_InitTypeDef GPIO_InitStructure1 = { GPIO_Pin_2|GPIO_Pin_9, //1 参数PIN2 PA2是UART2的TX引脚, PA9是UART1的TX引脚. GPIO_Speed_10MHz, //2 参数2M速度 GPIO_Mode_AF_PP }; //3 参数复用推挽输出 AF_PP复用模式 GPIO_Init(GPIOA, &GPIO_InitStructure1); //4 将3个参数初始化到GPIOA __NOP(); }很成功的编译通过了,现在要测试UART2了,也不想去建新任务了,简单的测试一下就行。哪就利用系统的空闲任务吧,这多省时间呀,哈哈!对los_task.c的osIdleTask()进行改一下:/***************************************************************************** Function : osTskIdleBGD Description : Idle background. Input : None Output : None Return : None *****************************************************************************/ static long ii=0;////测试用1 LITE_OS_SEC_TEXT WEAK VOID osIdleTask(VOID) { while (1) { printf("一个计数器:%d!\r\n",ii++);////测试用2 #if (LOSCFG_KERNEL_TICKLESS == YES) osTicklessHandler(); #else #if (LOSCFG_KERNEL_RUNSTOP == YES) osEnterSleep(); #endif #endif } }有////的地方就是已改的地方,接上STM32F103的开发板仿真,和PC串口线,我们运行看一下吧。哈哈,没有出现Huawei_LiteOS_Kernel时的STM32F411死机现象,看来Huawei_LiteOS比较稳定一点,没有严重BUG!进一步发现Huawei_LiteOS不接管理中断的,Huawei_LiteOS_Kernel是接管中断的,是不是跟这个有关???看来大部份问题,网络上是没有的,还是要自己去解决!接下来玩法就是,把众多的裸机功能代码测试好,比如LCD屏呀,WIFI呀,加速度计呀等等,都丢到LITE OS进行管理!最后呢,友情提示一下华为开源,不要因为开源了就不上心了,很多提交到代码仓的,大部份都是不能直接编译过的,一堆问题。有包含头文件路经是错的,或者没加路经的,有少.C .S文件的,几个版本之间来回找文件才能补全,补进来能用还好,不能用就坑人了,新手哪里经得起这坑? 是在增加难度吗。心里肯定是一万个MMP!还有就是OS版本太乱五花八门的,我记了一下,随便就有三个地方:我使用的OS下载地址,关注的是Harmony字眼!https://gitee.com/mirrors/HarmonyOS/tree/master/src/LiteOSLiteOS_Lab下载地址:https://github.com/LiteOS/LiteOS_Lab/tree/masterLiteOS下载地址:https://github.com/LiteOS/LiteOS/tree/master最主要的是,我都下载过来,看了一下OS的.C源码的日期,我用的这个版本返而新一点!!!!到此结束吧,最后感谢 樊心昊 和 星辰27 的回复与指导,谢谢!!!!