2093|9

7

帖子

0

资源

一粒金砂(初级)

如何跳出双层循环,加密程序等问题 [复制链接]

 
问题1:有什么更好的方案跳出双重循环,例如在for循环里面有个while循环等待某个位变化,但是怕被干扰了死在while循环里于是在while循环里计数:

方案1: 用goto:  while(判断){  if(i++>30000)   goto xxx}   感觉非常方便,但老师和一些书籍都说的最好不要用goto

方案2: while(判断){  if(i++>30000)   {i1=1; break;}  }  

            if(i1==1)    break;   //(在这跳出for循环)

请教各位还有什么方法跳出双层循环。



问题2:直接跳入函数好还是,打开函数入口好?

例如按键扫描程序,在获取键值后是直接进入 KEY_Deal()  //假设这个是按键处理程序

方案2:  if(SWITCH==0;)   return;               //这是主程序扫描程序之一,获取键值后赋值SWITCH,打开按键处理入口,让单片机扫过去处理键值,然后下一句是

              KEY_Deal();

我的理解是方案2能减少堆栈,并且在较为简单的主程序里不会影响处理按键速度。



问题3: 包含过多.h文件会增加代码长度吗?

我现在是用教程的方法,包含一个例如叫global.h文件,在这个文件里包含工程用到的所有的.h文件,然后所有的.c文件只需包含这个global.h就够了,我看了别人的程序是每个.c文件里包含用到的.h文件,用global.h方案会增加代码长度吗,还是会出现其他问题?感觉十分方便。



问题4: 我想先在第一次上电时检查FLASH的某些位置(如0x8555之类任意的)数据是否是自己赋值,然后在程序在第一次上电时往这些flash位置写入多个数据,这么做是想防止复制烧录文件,这种方法可行吗?对程序加密不是很懂,望指教。



目前在学习方向是精通C和了解各种电子元器件和电路,下一步方向跑嵌入式系统,学习ARM机和Linux系统。想法有什么不对请前辈指教下

此帖出自模拟电子论坛

回复

6

帖子

0

资源

一粒金砂(初级)

Linux系统 现在用的还多吗

回复

898

帖子

1

资源

纯净的硅(高级)

1.为什么不建议用goto,因为用了这个之后,程序的可维护性变差,程序少还好,程序大了之后,你这样乱跳,后面维护的人就要哭了
2.你可以尝试使用switch  case语句
3.你这个习惯不是太好,一般一个c文件对应一个.h文件,这样程序的可移植性好,维护起来也方便。
4.你第四个问题文的我没有明白你想问的到底是什么,所以没法回答的

回复

3998

帖子

0

资源

版主

本帖最后由 huo_hu 于 2018-9-7 13:04 编辑

while(判断 && i>30000 ){ i++; }
//while结束以后在加判断
if (i>30000) { 这里面是goto的代码}
else {这里是while退出的代码}


回复

3998

帖子

0

资源

版主

goto可以用,没问题,只是别goto到函数外面就好

回复

7

帖子

0

资源

一粒金砂(初级)

huo_hu 发表于 2018-9-7 13:06
goto可以用,没问题,只是别goto到函数外面就好

好的,我也觉得只是跳出循环的话goto也没问题,也不影响程序可读性

回复

7

帖子

0

资源

一粒金砂(初级)

曹伟1993 发表于 2018-9-6 20:04
1.为什么不建议用goto,因为用了这个之后,程序的可维护性变差,程序少还好,程序大了之后,你这样乱跳,后 ...

好的,我改下第三个的习惯,只让main.c包含所有.h文件

回复

3998

帖子

0

资源

版主

问题2:直接跳入函数好还是,打开函数入口好?
不存在跳入函数这么个操作,主要的问题是函数调用前有入栈出栈操作,即便没有参数没有返回值也不行,情况比较复杂还是让编译器安排的好。

方案2:  if(SWITCH==0;)   return;               //这是主程序扫描程序之一,获取键值后赋值SWITCH,打开按键处理入口,让单片机扫过去处理键值,然后下一句是。。。

如果KEY_Deal()函数里有 if(SWITCH==0;)   return; 那你就画蛇添足了

问题3: 包含过多.h文件会增加代码长度吗?

头文件内容过多会影响编译速度(一点点而已),不会影响代码,倒是过多的头文件可能会有意外的重名或冲突。不嫌麻烦只包含最少的头文件当然好。



问题4: 我想先在第一次上电时检查FLASH的某些位置(如0x8555之类任意的)数据是否是自己赋值,然后在程序在第一次上电时往这些flash位置写入多个数据,这么做是想防止复制烧录文件,这种方法可行吗?对程序加密不是很懂,望指教。

数据可以用define定义一下,你这个方法有几个问题:第一flash的修改是要先擦除然后才能写,擦除要按块来操作,一擦一块,即便你只写两个字节也要先缓存原块里的数据,stm32块大小不统一有些位置的块有32K大小,很麻烦。第二假设别人复制了你flash里所有内容那么连你做的标记也一起复制了,你又如何界定什么时候是第一次上电执行呢?

赞赏

1

查看全部赞赏


回复

7

帖子

0

资源

一粒金砂(初级)

huo_hu 发表于 2018-9-7 15:14
问题2:直接跳入函数好还是,打开函数入口好?
不存在跳入函数这么个操作,主要的问题是函数调用前有入栈 ...

我用的是STM8,操作flash可以直接写不用块操作
写完了加密方法我觉得不对,之前想的是第一次上电后往E2PROM写入数据例如往0x4000写入F,初始化时我是很据0x4000数据来判断是否正常第一次上电,忽略如果连E2PROM也读出来那就加密失败了,感觉自己的加密思维很局限,不知哪可以参考下其他人的程序加密方法。

回复

3998

帖子

0

资源

版主

本帖最后由 huo_hu 于 2018-9-7 19:37 编辑

写0不用擦,写1必须擦
加密这种事只能依赖厂家,自己弄意义不大

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/8 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表