shipeng

个性签名:模电临时工

  • 2024-12-26
  • 回复了主题帖: KEIL编译USB功能异常IAR编译正常

    freebsder 发表于 2024-12-26 15:01 一般不开优化,编译器很多时候优化的太扯,我记得有一次做IAP跳转的功能,IAR的编译器开的低档优化,直接 ... 这么离谱的优化我倒是没有遇到过,我只遇到过变量优化加个volatile修饰即解决,我现在还是习惯把优化开到最大一般都没啥问题

  • 2024-12-25
  • 回复了主题帖: KEIL编译USB功能异常IAR编译正常

    freebsder 发表于 2024-12-25 14:32 编译器有bug,换着来,实在不行就减小优化级别 减小优化级别我好像也试过也不行,但是现在它自己好了我都不知道是怎么好的,现在优化级别还是最高的

  • 回复了主题帖: KEIL编译USB功能异常IAR编译正常

    其实自从发现KEIL有问题后就一直用的IAR做编译,期间源代码也修改了很多次增加了一些功能如显示屏驱动。由于时隔很久刚刚又试了一下KEIL编译居然也好了,现在USB功能一切正常,keil工程配置基本没动,就添加了显示屏包含路径。  

  • 回复了主题帖: KEIL编译USB功能异常IAR编译正常

    bigbat 发表于 2024-12-25 11:00 我的猜测是:你的应用启动后,由于下面的代码挑战到应用了,建议先去掉如下代码,调试USB是否正常,在设置 ... 不对吧,如果是代码问题那IAR编译生成的目标文件也应该有问题才对,现在是用IAR编译功能是正常的。

  • 2024-12-24
  • 回复了主题帖: KEIL编译USB功能异常IAR编译正常

    之前也遇到过STM32F105作为主机读U盘升级的工程也是KEIL编译生成的目标文件USB功能不正常但其他功能没有问题可以正常跳转APP,IAR一切正常,也不知道是什么原因

  • 发表了主题帖: KEIL编译USB功能异常IAR编译正常

    本帖最后由 shipeng 于 2024-12-24 21:37 编辑 如附件工程,其中包含了MDK和IAR工程文件,此两个工程共用一套源码文件。芯片采用STM32F103C8T6,实现功能为USB连接电脑可识别为一个U盘,往其中放入FIRMWARE.bin文件可实现更新固件功能,且必须指定为FIRMWARE.bin文件才可更新固件,当写入其它文件不会改写固件数据,为了解决 “写入其它文件会改写固件数据的问题” 花了我一整天的摸鱼时间才调试完成,现在无偿分享给大家使用。实现方式是连接电脑或手机后初始文件存储了一个FIRMWARE.bin文件,此文件占用全部有效的固件FLASH区,写入数据必须替换FIRMWARE.bin的同名文件写入才有效,否则数据会写入无效空间。另外现在遇到的问题是使用KEIL MDK编译生成的目标文件USB功能异常,连接USB电脑不能识别设备,但IAR编译生成的目标文件USB功能是正常的连接电脑USB可以正常识别且操作正常,还希望大家能帮我找一下原因,在此感激不尽。  

  • 2024-07-21
  • 回复了主题帖: 关于FreeRTOS的任务消息替代事件组问题

    freebsder 发表于 2024-7-16 15:24 看看它下面的定时器是什么情况 不知是哪个下面的定时器?

  • 2024-07-15
  • 回复了主题帖: FreeRTOS怎样分配任务堆栈大小

    freebsder 发表于 2024-7-15 18:50 现在的IDE对freertos支持挺好的,你翻翻应该还有线程插件 这个有,之前用TI的CCS有用过,调试的时候可以发挥大用,STM32CubeIDE找了一下也有不过还没使用过

  • 回复了主题帖: FreeRTOS怎样分配任务堆栈大小

    walker2048 发表于 2024-7-14 22:25 首先、你可以定期打印堆栈大小和占用比例,设置超过80%或者多少就打印错误。 其次、Static Stack Anal ... 我觉得定期打印的办法有很高的局限性,没有出现堆栈溢出的时候还能看一下堆栈的使用情况,如果真出现堆栈溢出了定期打印根本来不及反应就进入HardFault了

  • 2024-07-14
  • 回复了主题帖: FreeRTOS怎样分配任务堆栈大小

    walker2048 发表于 2024-7-14 10:48 FreeRTOS自己就有堆栈占用和CPU占用分析,好好用工具也容易发现问题 这种的需要在软件运行以后串口打印出来吧?如果发生堆栈溢出程序就进入HardFault了你这个工具就失去作用了吧? Static Stack Analyzer工具不需要debug也不需要把程序烧写进MCU,只要编译完了就可以直接看到每个任务的堆栈需求大小

  • 2024-07-13
  • 发表了主题帖: FreeRTOS怎样分配任务堆栈大小

    最近寡人在使用FreeRTOS的时候老是碰到一些稀奇古怪的软件BUG,网上搜了一圈后发现似乎这些问题都是我一个人遇到,搜索结果毫无头绪。而且这些BUG让人有点无从下手。比如软件运行在内核代码中莫名其妙它就进入HardFault了,这个问题还好说一点大概你还能想到可能是堆栈溢出了,但是你却无法定位究竟是哪一个任务的堆栈出了问题。再比如当你在等待一个任务通知位阻塞任务时:另外一个不相干的任务通知位突然毫无征兆的打断了任务阻塞状态,对此你根本毫无头绪。此时你的代码就像是一个千疮百孔的巨轮随时都有沉入海底的风险,总有一种无助到泪流满面的感觉。但是如果你充分信任FreeRTOS本身,那以上所有问题的根源我认为很可能都是由于堆栈溢出所导致的问题。那么此时你就需要一个火眼金睛的工具来告诉你到底是什么任务的堆栈出了问题,这些任务的堆栈究竟要分配多少才不会溢出?这个问题同样困扰了我很久,网上也搜索过但是一直没有找到满意的答案。事情的转机刚好就发生在今天上午一个神奇的时刻:楼主之前使用过TI的CCS软件,对它的堆栈分析功能印象深刻,我想到STM32CubeIDE的软件和TI的CCS软件同样都是基于eclipse,本是同根生CCS可以没理由STM32CubeIDE不行啊?此时我总算是开窍了,从此一发不可收拾,终于让我找到了正确的解决问题的方法: 点击红框中的“Max cost”可以将堆栈占用最高的函数排在最前   根据“Max cost”中的值将对应任务堆栈分配略大于即可,另外本次探索我还发现了另外一个好玩的东东: 翻译了才知道这个工具是用来分析函数复杂度的complexity值越高函数就越复杂,我这个函数的complexity值最高的已经到了89了,这个函数连我自己看起来都有点费劲,因此对继承者很不友好。  

  • 回复了主题帖: 关于FreeRTOS的任务消息替代事件组问题

    Jacktang 发表于 2024-7-13 09:19 当DMA传输完成后置位“CPL_U3TX_SIG”任务消息,此时任务中ReadEvent = osSignalWait(ACK_U3TX_S ... “CPL_U3TX_SIG”消息位用来指示DMA传输完成,"ACK_U3TX_SIG"消息位我在串口接收处理中置位,用来指示串口数据收到从机应答不需要再重发此数据了。因为我做了一个串口数据重发机制,只有收到目标设备应答才会退出重发,否则会重发10次数据。

  • 2024-07-12
  • 发表了主题帖: 关于FreeRTOS的任务消息替代事件组问题

    最近在使用FreeRTOS的任务消息功能替代事件组,遇到一个毫无头绪的问题:当在中断函数中置位任务消息osSignalSet(TaskHandle,1);时会导致osEvent ReadEvent = osSignalWait(2,100);退出等待状态。仿真调试此时的ReadEvent.value.v=1,但是osSignalWait(2,100);却并没有阻塞100毫秒,不知是何原因?请大神们指教! 以下我附上我的源码: #define CPL_U3TX_SIG        0x00000001u #define ACK_U3TX_SIG        0x00000002u   复制 void StartTaskAndroidTx(void const * argument) {         MyDataStruct_t *tx_buffer;         osSignalSet(AndroidTxHandle,CPL_U3TX_SIG);//osSemaphoreRelease(myBinarySemU3TxHandle);         /* Infinite loop */         for(;;)         {                 if (pdPASS==xQueueReceive(U3TxQueueHandle, (uint8_t*)&tx_buffer, osWaitForever))                 {                         if (NULL!=tx_buffer) {                                 uint8_t data_len=tx_buffer->length;                                 if (0!=data_len) {                                         osEvent ReadEvent;                                         osSignalWait(CPL_U3TX_SIG,100);                                         osSignalWait(ACK_U3TX_SIG,0);                                         memcpy(DMA_USART3_TxBuf,tx_buffer->DatArea,data_len);                                         vPortFree((uint8_t*)tx_buffer);                                         for (int i = 0; i < 10; ++i) {                                                 LCD_RS485_DE=LCD_RS485_RE=1;                                                 LL_DMA_DisableStream(DMA1,LL_DMA_STREAM_3);                                                 LL_DMA_SetDataLength(DMA1,LL_DMA_STREAM_3,data_len);                                                 LL_DMA_EnableStream(DMA1,LL_DMA_STREAM_3);                                                 ReadEvent = osSignalWait(ACK_U3TX_SIG,100);                                                 if (ReadEvent.value.v & ACK_U3TX_SIG)break;                                         }                                 }                                 else vPortFree((uint8_t*)tx_buffer);                         }                 }         } } 以下为中断中发送任务消息: 复制 void DMA1_Stream3_IRQHandler(void) {   /* USER CODE BEGIN DMA1_Stream3_IRQn 0 */         if (LL_DMA_IsEnabledIT_TC(DMA1,LL_DMA_STREAM_3)!=RESET && LL_DMA_IsActiveFlag_TC3(DMA1) != RESET)         {                 LL_DMA_ClearFlag_TC3(DMA1);                 LL_DMA_DisableStream(DMA1,LL_DMA_STREAM_3); osSignalSet(AndroidTxHandle,CPL_U3TX_SIG);         }   /* USER CODE END DMA1_Stream3_IRQn 0 */   /* USER CODE BEGIN DMA1_Stream3_IRQn 1 */   /* USER CODE END DMA1_Stream3_IRQn 1 */ } 当DMA传输完成后置位“CPL_U3TX_SIG”任务消息,此时任务中ReadEvent = osSignalWait(ACK_U3TX_SIG,100);也退出等待了,我的本意是要收到ACK_U3TX_SIG消息才退出阻塞   使用特权 更多操作

  • 2024-03-25
  • 回复了主题帖: osPriorityRealtime任务不能被终止

    wangerxian 发表于 2024-3-25 15:17 意思是想开机时,先停止GUI任务创建的线程? 是的,主要是上电不让这个任务运行,或者我的本意是上电时并不想创建某个任务,但是STM32CubeIDE好像没有这个选项,只要你在.ioc文件中新增了某个任务那么这个任务默认就在FRERTOS_Init()函数中被创建了你没得选。当然你也可以选择全手动创建这个任务就没有这个问题了,但我却没有这么干因此遇到了问题,发出来希望能帮助到有缘人

  • 2024-03-23
  • 发表了主题帖: osPriorityRealtime任务不能被终止

    本帖最后由 shipeng 于 2024-3-23 16:02 编辑 最近用STM32CubeIDE配置FreeRTOS的时候发现:osPriorityRealtime级别的任务创建之后在内核启动(调用函数osKernelStart())前不能被终止,否则会导致HardFault异常中断。至于在内核启动后能不能终止任务我没有试。我的操作是在函数void MX_FREERTOS_Init(void)中创建任务REMOTE_CMDHandle,在MX_FREERTOS_Init函数返回前调用了osThreadTerminate(REMOTE_CMDHandle);并且将任务句柄清空REMOTE_CMDHandle = NULL;我这么做的初衷是REMOTE_CMDHandle任务上电不让它运行,等待用户操作后再创建运行。由于使用STM32CubeIDE图形化创建任务后默认都会上电运行,所以在创建后加了一句任务终止以达到我不可告人的目的。     debug跟踪发现具体原因是在堆栈初始化函数pxPortInitialiseStack返回时进入prvIdleTask函数->prvCheckTasksWaitingTermination()->( void ) uxListRemove( &( pxTCB->xStateListItem ) )运行到“if( pxList->pxIndex == pxItemToRemove )”时出现非法地址0xfffffffd触发HardFault_Handler()异常中断,最后的解决办法是将优先级设置为osPriorityHigh成功解决,要深究具体原因还需要各位大神们指点迷津。    

  • 2024-03-14
  • 回复了主题帖: TM4C123芯片锁死无法烧写

    研究了半天发现我这个不是芯片锁死的问题,换了一个第三方做的XDS100V3发现可以正常烧写程序了,感情官方的大几千块的XDS110还不如一百块的第三方XDS100V3好用,我也是服了TI

  • 2024-03-11
  • 回复了主题帖: TM4C123芯片锁死无法烧写

    Jacktang 发表于 2024-3-10 15:18 分享一下别人的方法,可能不一定解决楼主的问题,可以借鉴一下   由于本人刚接触到TM4C123Glaun ... 感谢大佬热情回复

  • 2024-03-10
  • 发表了主题帖: TM4C123芯片锁死无法烧写

    使用TI官方的UniFlash+XDS110正常烧写软件,之前都一直未出问题。最近频繁遇到“Error -1170 @ 0x0”错误无法再次烧录。网上搜索说是芯片进入生产模式了,需要进入开发模式才能烧录。但是找了一圈也没有找到可行的进入开发模式的方法。在此恳请各位大牛指点迷津...  

统计信息

已有64人来访过

  • 芯积分:810
  • 好友:2
  • 主题:46
  • 回复:281

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言