Keil5编译问题(__at和__nop)

在编译灵鸥创新的开源有感FOC代码时遇到__nop未定义和__at属性不识别的问题。通过将__nop替换为__NOP解决了未定义问题。对于__at属性,发现是Keil5 AC6编译器与AC5的不同,需使用__attribute__((section(".ARM.__at_0x7800")))形式。然而,尝试将0x7800替换为宏HALL_LEARN_ADDR导致编译失败,尚不清楚正确改写形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译灵鸥创新的开源有感FOC代码(lks08x_foc_open_hallsense-main)时,提示异常,为以下两个问题。

  1. 编译时,提示__nop没定义。

全局搜索,有__NOP的宏定义,然后把__nop改成__NOP,编译正常。

  1. 编译时,提示无法识别__at属性。

编写一个基于AT89C51单片机的简单秒表程序,通常需要以下几个步骤: 1. **设置工程**: - 打开Keil uVision5,新建一个新项目,选择支持AVR的项目模板。 - 选择你的AT89C51作为目标设备,并配置合适的存储空间(如Flash、EEPROM等)。 2. **设计硬件连接**: - 确保外部计数器或定时器(例如Timer 0)已正确连接到单片机,用于时间测量。 3. **编写源代码**: ```c #include <reg52.h> void delay(unsigned int time); unsigned int timerValue; char flag = 0; __attribute__((interrupt, auto_preset)) void _T0_VECTOR(void) { if (flag == 0) { // 当标志位未置1时计数 timerValue++; if (timerValue >= 65536) { // 完成一次定时器周期,清零并重新开始计数 timerValue = 0; flag = 1; // 设置标志位,防止无限循环 } } else { // 标志位为1时,表示开始计时 flag = 0; // 清除标志位 while (!flag); // 当flag置1时跳出此循环,停止计时 } } void delay(unsigned int time) { for (unsigned int i = 0; i < time; i++) { _nop(); // 单片机空操作指令,占时 } } void startStop() { if (flag == 0) { // 如果秒表未启动,启动 EA = 1; // 开启全局中断 ET0 = 1; // 启动定时器0 TR0 = 1; // 启动 Timer 0 工作 flag = 1; } else { // 秒表已启动,停止 TR0 = 0; // 关闭 Timer 0 EA = 0; // 关闭全局中断 flag = 0; } } int main(void) { initTimer0(); // 初始化定时器0 while (1) { startStop(); // 用户请求计时时调用这个函数 printf("Time Elapsed: %d seconds\n", timerValue / 2); // 显示秒数,假设每个计数周期等于半秒 delay(1000); // 暂停1秒等待用户输入 } } ``` 4. **调试运行**: - 编译并链接项目,然后在模拟器或硬件上运行程序,通过按键或其他输入触发`startStop`函数,查看秒表是否正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值