作者小头像 Lv.1
0 成长值

个人介绍

我是小白,一个充满着对科学渴望的小白!

感兴趣或擅长的领域

编程语言、IOT、人工智能
个人勋章
TA还没获得勋章~
成长雷达
0
0
0
0
0

个人资料

个人介绍

我是小白,一个充满着对科学渴望的小白!

感兴趣或擅长的领域

编程语言、IOT、人工智能

达成规则

发布时间 2020/08/08 19:52:41 最后回复 万国倾城 2020/11/16 23:42:06 版块 IoT物联网
5961 12 0
他的回复:
这个问题终于搞定了,经过一步一步仿真,没一步都查看变量值,发现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  的回复与指导,谢谢!!!!
发布时间 2020/08/28 19:09:10 最后回复 bingbingyouli_2020 2020/10/19 15:40:33 版块 IoT物联网
1862 6 0
他的回复:
/*****************************************************************************  Function    : LOS_Start  Description : 任务启动功能  Input       : None  Output      : None  Return      : LOS_OK  *****************************************************************************/ LITE_OS_SEC_TEXT_INIT UINT32 LOS_Start() {     UINT32 uwRet; #if (LOSCFG_BASE_CORE_TICK_HW_TIME == NO)     uwRet = osTickStart();     if (uwRet != LOS_OK)     {         //PRINT_ERR("osTickStart error\n");         return uwRet;     } #else     os_timer_init(); #endif     LOS_StartToRun();     //串口测试  开始     USART_InitTypeDef USART_InitStructure;     USART_InitStructure.USART_BaudRate = 115200;//波特率设置     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式     USART_InitStructure.USART_StopBits = USART_StopBits_2;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Tx; //发模式 |              USART_Init(USART2, &USART_InitStructure); //初始化串口2     USART_Cmd(USART2, ENABLE);  //使能串口2     //串口测试  结束              return uwRet; }如上所示,放在LOS_Start()内的最后面,试了一下,还是一样的不正常。int main(void) {         UINT32 uwRet;     uwRet = osMain();     if (uwRet != LOS_OK) {         return LOS_NOK;     }     LOS_Start();          //串口测试  开始     USART_InitTypeDef USART_InitStructure;     USART_InitStructure.USART_BaudRate = 115200;//波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_2;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Tx; //发模式 |              USART_Init(USART2, &USART_InitStructure); //初始化串口2     USART_Cmd(USART2, ENABLE);  //使能串口2     //串口测试  结束                 while(1);         /* Replace the dots (...) with your own code.  */     // return LOS_NOK;  // 理论上,执行不到这里!!           }如上所示,放在 LOS_Start();外的最后面,还是不正常呀void GPIOCx_initLED(void)//LED RC5的初始化 {       /* 开发板上的C5,C8,C9外接了个LED */   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//启用RC口外设时钟     GPIO_InitTypeDef GPIO_Init_Cx;//定义结构体,   GPIO_Init_Cx.GPIO_Mode = GPIO_Mode_OUT;           //结构体参数:输出模式   GPIO_Init_Cx.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;    //PIN   GPIO_Init_Cx.GPIO_PuPd = GPIO_PuPd_NOPULL;        //没有上拉   GPIO_Init_Cx.GPIO_Speed = GPIO_Speed_50MHz;       //速度   GPIO_Init_Cx.GPIO_OType = GPIO_OType_PP;          //推挽   GPIO_Init(GPIOC,&GPIO_Init_Cx);//载入参数到硬件   GPIO_WriteBit(GPIOC,GPIO_Pin_5,Bit_RESET);//C测试灯了!     GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);//   GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET);     GPIO_WriteBit(GPIOC,GPIO_Pin_5,Bit_SET);   GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_RESET);   GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_SET);              //串口测试  开始     USART_InitTypeDef USART_InitStructure;     USART_InitStructure.USART_BaudRate = 115200;//波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_2;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Tx; //发模式 |              USART_Init(USART2, &USART_InitStructure); //初始化串口2     USART_Cmd(USART2, ENABLE);  //使能串口2     //串口测试  结束        }如上所示,这个GPIOCx_initLED()是任务10的功能函数,这是正常的。我放在这里边也是不行的,还是会死机在:所以呢,我想不明白问题出现在哪里了。~~~~~~~~~带上附件!
发布时间 2020/08/08 19:52:41 最后回复 万国倾城 2020/11/16 23:42:06 版块 IoT物联网
5961 12 0
发布时间 2020/06/18 01:53:06 最后回复 老李子。 2020/08/21 22:23:12 版块 IoT物联网
5538 7 0
发布时间 2020/06/18 01:53:06 最后回复 老李子。 2020/08/21 22:23:12 版块 IoT物联网
5538 7 0
他的回复:
谢谢分享!先不说接管的问题,从los_hwi.c来看,一堆中断源都会进入osHwiDefaultHandler(),都是SysTick Handler,Bus Fault Handler等等,里面只是获取中断号,然后while(1);我想,在中断里面,是只要获取中断号码,OS就可以跟据中断号进行处量了吧?因为它上面有张中断表LITE_OS_SEC_VEC HWI_PROC_FUNC m_pstHwiForm[OS_M4_VECTOR_CNT],还有就是我的osInterrupt()有点差异,会不会影响正常使用??。#include "los_hwi.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ /*lint -save -e40 -e522 -e533*/ /*lint -restore*/ UINT32  g_vuwIntCount = 0; #pragma  location = ".vector" LITE_OS_SEC_VEC HWI_PROC_FUNC m_pstHwiForm[OS_M4_VECTOR_CNT] = {//ARM设计硬件时,规定的,发生XX中断就跳转到某个地址   0,                    // [0] Top of Stack  栈顶地址   Reset_Handler,        // [1] reset  复位   osHwiDefaultHandler,  // [2] NMI Handler  不可屏蔽中断,时钟安全系统等   osHwiDefaultHandler,  // [3] Hard Fault Handler  硬件失效   osHwiDefaultHandler,  // [4] MPU Fault Handler   微处理器和内存保护单元   osHwiDefaultHandler,  // [5] Bus Fault Handler  总线错误   osHwiDefaultHandler,  // [6] Usage Fault Handler  错误应用   0,                    // [7] Reserved  保留   0,                    // [8] Reserved   0,                    // [9] Reserved   0,                    // [10] Reserved   osHwiDefaultHandler,  // [11] SVCall Handler  通过SWI指今的系统服务   osHwiDefaultHandler,  // [12] Debug Monitor Handler  调试监视器   0,                    // [13] Reserved   osPendSV,             // [14] PendSV Handler  可挂起的系统服务   osHwiDefaultHandler,  // [15] SysTick Handler  系统滴答定时器 }; HWI_PROC_FUNC m_pstHwiSlaveForm[OS_M4_VECTOR_CNT] = {0}; /*****************************************************************************  Function    : osIntNumGet  Description : Get a interrupt number  获取中断号码  Input       : None  Output      : None  Return      : Interrupt Indexes number  *****************************************************************************/ LITE_OS_SEC_TEXT_MINOR UINT32 osIntNumGet(VOID) {    UINT32 uwIntNum;   __asm ("mrs %0, ipsr" : "=r" (uwIntNum));   return uwIntNum; } /*****************************************************************************  Function    : osHwiDefaultHandler  Description : default handler of the hardware interrupt  Input       : None   硬件中断的默认处理程序  Output      : None  Return      : None       ?[15] SysTick Handler  *****************************************************************************/ LITE_OS_SEC_TEXT_MINOR VOID  osHwiDefaultHandler(VOID) {     UINT32 irq_num = osIntNumGet();     while(1); } /*****************************************************************************  Function    : osInterrupt  Description : Hardware interrupt entry function 硬件中断输入功能  Input       : None发生什么中断首先进入到osInterrupt函数中判断,根据中断是否使能、优先级等等信息来调用相应函数进行处理  Output      : None  Return      : None  *****************************************************************************/ LITE_OS_SEC_TEXT VOID  osInterrupt(VOID) {     UINT32 uwHwiIndex;     UINT32 uwIntSave;     uwIntSave = LOS_IntLock();//先保存PRIMASK的值,然后关闭全部可屏蔽中断,相当于进入临界区。     g_vuwIntCount++;     LOS_IntRestore(uwIntSave);//恢复PRIMASK的值,相当于进入退出区。     uwHwiIndex = osIntNumGet();//获取当前触发的中断号     if (m_pstHwiSlaveForm[uwHwiIndex] !=0)//如果该位置有处理函数就开始调用处理函数来处理中断     {         m_pstHwiSlaveForm[uwHwiIndex]();// 调用处理函数来处理中断     }     uwIntSave = LOS_IntLock();//先保存PRIMASK的值,然后关闭全部可屏蔽中断,相当于进入临界区。          g_vuwIntCount--;/*g_vuwIntCount这个值用于表示当前程序的状态,是否处于中断(异常)状态,                     如果处于异常状态有些操作不能进行,例如:获取互斥锁,调用系统延时函数等等,                     防止在中断处理中出现死锁的情况,导致一直无法退出中断*/          LOS_IntRestore(uwIntSave);//恢复PRIMASK的值,相当于进入退出区。 } /*****************************************************************************  Function    : osHwiInit  Description : initialization of the hardware interrupt  硬件中断的初始化  Input       : None  Output      : None  Return      : OS_SUCCESS  *****************************************************************************/ LITE_OS_SEC_TEXT_INIT VOID osHwiInit() {     UINT32 uwIndex;     for(uwIndex = OS_M4_SYS_VECTOR_CNT; uwIndex  OS_M4_VECTOR_CNT; uwIndex++)     {         m_pstHwiForm[uwIndex] = osHwiDefaultHandler;     }     /* Interrupt vector table location 中断向量表位置 */      *(volatile UINT32 *)OS_NVIC_VTOR =  (UINT32)m_pstHwiForm;      *(volatile UINT32 *)OS_NVIC_AIRCR = (0x05FA0000 | OS_NVIC_AIRCR_PRIGROUP  8); } /*****************************************************************************  Function    : LOS_HwiCreate  Description : create hardware interrupt    创建硬件中断  Input       : uwHwiNum   --- hwi num to create                usHwiPrio  --- priority of the hwi                usMode     --- unused                pfnHandler --- hwi handler                uwArg      --- param of the hwi handler  Output      : None  Return      : OS_SUCCESS on success or error code on failure  *****************************************************************************/ LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate( HWI_HANDLE_T  uwHwiNum,                                             HWI_PRIOR_T   usHwiPrio,                                             HWI_MODE_T    usMode,                                             HWI_PROC_FUNC pfnHandler,                                             HWI_ARG_T     uwArg ) {     UINTPTR uvIntSave;     if (NULL == pfnHandler)     {         return OS_ERRNO_HWI_PROC_FUNC_NULL;     }     if (uwHwiNum >= OS_M4_IRQ_VECTOR_CNT)     {         return OS_ERRNO_HWI_NUM_INVALID;     }     if (m_pstHwiForm[uwHwiNum + OS_M4_SYS_VECTOR_CNT] != osHwiDefaultHandler)     {         return OS_ERRNO_HWI_ALREADY_CREATED;     }     if (usHwiPrio > OS_HWI_PRIO_LOWEST)     {         return OS_ERRNO_HWI_PRIO_INVALID;     }     uvIntSave = LOS_IntLock();     osSetVector(uwHwiNum, pfnHandler);     nvicSetIRQ(uwHwiNum);     nvicSetIrqPRI(uwHwiNum, usHwiPrio  4);     LOS_IntRestore(uvIntSave);     return LOS_OK; } /*****************************************************************************  Function    : LOS_HwiDelete  Description : Delete hardware interrupt    删除硬件中断  Input       : uwHwiNum   --- hwi num to delete  Output      : None  Return      : LOS_OK on success or error code on failure  *****************************************************************************/ LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T uwHwiNum) {     UINT32 uwIntSave;     if (uwHwiNum >= OS_M4_IRQ_VECTOR_CNT)     {         return OS_ERRNO_HWI_NUM_INVALID;     }     nvicClrIRQ(uwHwiNum);     uwIntSave = LOS_IntLock();     m_pstHwiForm[uwHwiNum + OS_M4_SYS_VECTOR_CNT] = (HWI_PROC_FUNC)osHwiDefaultHandler;     LOS_IntRestore(uwIntSave);     return LOS_OK; } #ifdef __cplusplus #if __cplusplus } #endif /* __cplusplus */ #endif /* __cplusplus */小白最后一个问题,OS的时钟TICK是在哪个文件里的函数是设定的,找了一下没有到哦。谢谢!!/**不是指这个设定,我用的OS版本有个los_config.h,进行OS配置 * @ingroup los_config * 一秒钟的TICK数量 */#define LOSCFG_BASE_CORE_TICK_PER_SECOND                1000/*----------------------------------------------------------------------------------------*/自问自答20200822OS的时钟tick设置在los_hw_tick.c的osTickStart()进行了设置!而tick的中断服务在los_tick.c的osTickHandler(),可以在*.c里面查看实现细节