[蓝牙芯片] CH571 编译错误的问题

[复制链接]
920|7
 楼主| pq113_6 发表于 2023-3-26 18:10 | 显示全部楼层 |阅读模式
link的时候提示错误:
relocation truncated to fit: R_RISCV_JAL against symbol `UART0_IRQHandler' defined in .text.UART0_IRQHandler section in
参考CH582的startup改了一下,CH571的中断向量表是
  1. j   UART0_IRQHandler           /* UART0 */
把j改为.word
  1. .word   UART0_IRQHandler           /* UART0 */
这样可以编译通过,但是中断就进不去了。

把官方例程TMR一样改一下,发现也是中断进不去了,说明不能改为.word。如何解决这个问题?还是说CH571有bug?中断不能放在代码太大的后面?我看USB里面的中断是放在while(1)循环里面执行。
WCHTECH75 发表于 2023-3-27 10:49 | 显示全部楼层
可以看看是否是中断函数定义时:
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
没有添加导致。
 楼主| pq113_6 发表于 2023-3-27 11:02 | 显示全部楼层
WCHTECH75 发表于 2023-3-27 10:49
可以看看是否是中断函数定义时:
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((secti ...

有啊
  1. __INTERRUPT
  2. __HIGH_CODE
  3. void SysTick_Handler(void)

  1. __INTERRUPT
  2. __HIGH_CODE
  3. void USB_IRQHandler(void)


我从CH582里面拷贝了宏定义
  1. #ifndef __HIGH_CODE
  2. #define __HIGH_CODE   __attribute__((section(".highcode")))
  3. #endif

  4. #ifndef __INTERRUPT
  5. #ifdef INT_SOFT
  6. #define __INTERRUPT   __attribute__((interrupt()))
  7. #else
  8. #define __INTERRUPT   __attribute__((interrupt("WCH-Interrupt-fast")))
  9. #endif
  10. #endif


而且官方例程TMR里面默认是带这两个的:
  1. __attribute__((interrupt("WCH-Interrupt-fast")))
  2. __attribute__((section(".highcode")))
  3. void TMR0_IRQHandler(void) // TMR0 定时中断

WCHTECH75 发表于 2023-3-27 13:48 | 显示全部楼层
截图中并没有看到串口0中断时如何写的,可以打开一个新的例程,按照例程UART1例程去写串口0试试看呢,也可以将例程发送至hy@wch.cn,我们来帮你看看。
 楼主| pq113_6 发表于 2023-3-27 14:33 | 显示全部楼层
WCHTECH75 发表于 2023-3-27 13:48
截图中并没有看到串口0中断时如何写的,可以打开一个新的例程,按照例程UART1例程去写串口0试试看呢,也可 ...

可以了,谢谢!就是少了highcode,拷贝的时候少拷贝了highcode,CH582可以编译,571编译才报错。
 楼主| pq113_6 发表于 2023-3-27 20:30 | 显示全部楼层
WCHTECH75 发表于 2023-3-27 13:48
截图中并没有看到串口0中断时如何写的,可以打开一个新的例程,按照例程UART1例程去写串口0试试看呢,也可 ...

不好意思,还是碰到中断的问题,SysTick中断进不去。初始化代码和中断程序:
  1. void systickInit(uint8_t ms)
  2. {
  3.     SysTick_Config((GetSysClock() / 1000) * ms);
  4. }

  5. __INTERRUPT
  6. __HIGH_CODE
  7. void SysTick_Handler(void)
  8. {
  9.     SysTick->SR = 0;
  10.     if (gTimerDelayCount != 0u)
  11.     {
  12.         --gTimerDelayCount;
  13.     }
  14.     timeHandle();
  15.     Printf("Systick\n");
  16. }

其他中断是好的,有什么特别注意的地方吗?




WCHTECH75 发表于 2023-3-28 14:45 | 显示全部楼层
可以参考此链接:
https://www.cnblogs.com/debugdabiaoge/p/15765991.html
WCHTECH75 发表于 2023-3-28 14:45 | 显示全部楼层
可以参考此链接:
https://www.cnblogs.com/debugdabiaoge/p/15765991.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

284

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部