打印
[蓝牙芯片]

CH571 编译错误的问题

[复制链接]
315|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的中断向量表是
j   UART0_IRQHandler           /* UART0 */
把j改为.word
.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 ...

有啊
__INTERRUPT
__HIGH_CODE
void SysTick_Handler(void)

__INTERRUPT
__HIGH_CODE
void USB_IRQHandler(void)


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

#ifndef __INTERRUPT
#ifdef INT_SOFT
#define __INTERRUPT   __attribute__((interrupt()))
#else
#define __INTERRUPT   __attribute__((interrupt("WCH-Interrupt-fast")))
#endif
#endif


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

使用特权

评论回复
地板
WCHTECH75| | 2023-3-27 13:48 | 只看该作者
截图中并没有看到串口0中断时如何写的,可以打开一个新的例程,按照例程UART1例程去写串口0试试看呢,也可以将例程发送至hy@wch.cn,我们来帮你看看。

使用特权

评论回复
5
pq113_6|  楼主 | 2023-3-27 14:33 | 只看该作者
WCHTECH75 发表于 2023-3-27 13:48
截图中并没有看到串口0中断时如何写的,可以打开一个新的例程,按照例程UART1例程去写串口0试试看呢,也可 ...

可以了,谢谢!就是少了highcode,拷贝的时候少拷贝了highcode,CH582可以编译,571编译才报错。

使用特权

评论回复
6
pq113_6|  楼主 | 2023-3-27 20:30 | 只看该作者
WCHTECH75 发表于 2023-3-27 13:48
截图中并没有看到串口0中断时如何写的,可以打开一个新的例程,按照例程UART1例程去写串口0试试看呢,也可 ...

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

__INTERRUPT
__HIGH_CODE
void SysTick_Handler(void)
{
    SysTick->SR = 0;
    if (gTimerDelayCount != 0u)
    {
        --gTimerDelayCount;
    }
    timeHandle();
    Printf("Systick\n");
}

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




使用特权

评论回复
7
WCHTECH75| | 2023-3-28 14:45 | 只看该作者
可以参考此链接:
https://www.cnblogs.com/debugdabiaoge/p/15765991.html

使用特权

评论回复
8
WCHTECH75| | 2023-3-28 14:45 | 只看该作者
可以参考此链接:
https://www.cnblogs.com/debugdabiaoge/p/15765991.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

284

帖子

2

粉丝