打印
[PIC®/AVR®/dsPIC®产品]

PIC16F 单片机计算复杂结构体数组卡导致不能及时进入Lin中...

[复制链接]
3846|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫声欲碎|  楼主 | 2020-12-23 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试发现单片机对于结构体数组计算的时候执行速度超级慢,会卡在结构体数组寻址那里,导致我的中断进不了,lin信号丢失。

结构体定义如下:
typedef struct boot_checksum_single_monitor_ccb
{
   U8 state;   
   U16 checksum;               
   U16 address;                  
} BOOT_CHECKSUM_SINGLE_MONITOR_CCB;
结构体数组声明如下:
static BOOT_CHECKSUM_SINGLE_MONITOR_CCB chk_monit_ccb[BOOT_CHECKSUM_NUM_BLOCKS];

通常卡在类似下面的语句,执行时间超长:

if(checksumState == chk_monit_ccb.state)

请问这种的怎么重构代码?

使用特权

评论回复
沙发
lcczg| | 2020-12-23 16:37 | 只看该作者
觉得你定义了结构体数组chk_monit_ccb[BOOT_CHECKSUM_NUM_BLOCKS]。 为何这里却不是了呐 chk_monit_ccb.state

使用特权

评论回复
评论
lcczg 2020-12-28 15:05 回复TA
@箫声欲碎 :你可以看下反汇编代码,看下哪里代码长了,执行慢了。 
箫声欲碎 2020-12-23 20:20 回复TA
抱歉,应该是chk_monit_ccb[i].state. 写错了。 
板凳
yzq13246068880| | 2020-12-28 17:05 | 只看该作者
非常不错

使用特权

评论回复
地板
wooda| | 2021-1-2 11:10 | 只看该作者
这样搞一下:

u8 temp;
temp=  chk_monit_ccb[i].state;
if(checksumState == temp)

使用特权

评论回复
5
箫声欲碎|  楼主 | 2021-1-4 09:29 | 只看该作者
wooda 发表于 2021-1-2 11:10
这样搞一下:

u8 temp;

最主要的原因还是单片机对于复杂的结构体解析的问题,我打算把结构体拆解,不用结构体,用单个全局变量代替了。

使用特权

评论回复
6
wooda| | 2021-1-4 09:51 | 只看该作者
箫声欲碎 发表于 2021-1-4 09:29
最主要的原因还是单片机对于复杂的结构体解析的问题,我打算把结构体拆解,不用结构体,用单个全局变量代 ...

结构体有助于编程人员理解和使用,在代码中适当用指针或者临时变量帮助单片机简化解析问题是合适的。
从一大堆变量到结构体使用,再到回到一大堆变量,再回到结构体,如此反复又不断改进使用方法,是我的历程

使用特权

评论回复
7
heimaojingzhang| | 2021-1-12 12:54 | 只看该作者
可不可以换一种表现形式

使用特权

评论回复
8
keaibukelian| | 2021-1-12 12:58 | 只看该作者
单片机的结构真的好复杂

使用特权

评论回复
9
labasi| | 2021-1-12 13:00 | 只看该作者
感觉结构体不太适用于单片机 太占空间了

使用特权

评论回复
10
paotangsan| | 2021-1-12 13:02 | 只看该作者
尽量使用局部变量来取代全局变量

使用特权

评论回复
11
renzheshengui| | 2021-1-12 13:03 | 只看该作者
总之就是想让程序更快的执行  同时尽可能占用更小的资源

使用特权

评论回复
12
heisexingqisi| | 2021-1-12 21:15 | 只看该作者
换一种方法

使用特权

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

本版积分规则

5

主题

25

帖子

0

粉丝