打印
[开发工具]

MDK下新的编程习惯,和大家分享一下、、、、

[复制链接]
11667|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2014-11-16 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如 以前写

uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

还有 在一个文件下定义 __IO   t = 0;
另一个文件下,可以定义为只读或只写  extern __I  t;

还有sizeof这个用的时候要谨慎 在KEIL51编译器要注意。
沙发
LOVE_ELEC| | 2014-11-16 11:42 | 只看该作者
楼主,可以阐述下详细的理由!

使用特权

评论回复
板凳
adce| | 2014-11-16 12:17 | 只看该作者
1.愿闻其区别...
2.
core_cm4.h
#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
#endif
#define     __O     volatile             /*!< Defines 'write only' permissions                */
#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
3.sizeof(var)/sizeof(int)

使用特权

评论回复
地板
mmuuss586| | 2014-11-16 13:19 | 只看该作者

谢谢楼主分享;

使用特权

评论回复
5
sedatefire| | 2014-11-16 19:34 | 只看该作者
这个,从编译角度上讲,其实没什么差异
只是早期的编译器可能编译不过。

使用特权

评论回复
6
sxhhhjicbb| | 2014-11-16 19:45 | 只看该作者
uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

愿闻其详

使用特权

评论回复
7
icecut| | 2014-11-16 19:50 | 只看该作者

使用特权

评论回复
8
fanxsd| | 2014-11-16 19:54 | 只看该作者
这是要啥意思呢!求解答!

使用特权

评论回复
9
xlsbz|  楼主 | 2014-11-16 19:58 | 只看该作者
sxhhhjicbb 发表于 2014-11-16 19:45
uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

哦。那个mdk检查边界啊。我说的对吧??

使用特权

评论回复
10
xlsbz|  楼主 | 2014-11-16 20:00 | 只看该作者
sxhhhjicbb 发表于 2014-11-16 19:45
uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

这2种,tmp[18]报错。

使用特权

评论回复
11
xlsbz|  楼主 | 2014-11-16 20:15 | 只看该作者
icecut 发表于 2014-11-16 19:50

uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

/* Private functions -------------------------*/
int main(void)
{
tmp[18] = 0;
===============
..\user\main.c(112): warning:  #175-D: subscript out of range

使用特权

评论回复
12
xlsbz|  楼主 | 2014-11-16 20:16 | 只看该作者
uint8_t   tmp[20] = {0,1,2,3,4,5,6,7,8};

/* Private functions -------------------------*/
int main(void)
{
tmp[18] = 0;
=====================
".\OBJ\firmware.axf" - 0 Error(s), 0 Warning(s).

使用特权

评论回复
13
xlsbz|  楼主 | 2014-11-16 20:16 | 只看该作者
难道大家没发现 那么??



使用特权

评论回复
14
xlsbz|  楼主 | 2014-11-16 20:18 | 只看该作者
sedatefire 发表于 2014-11-16 19:34
这个,从编译角度上讲,其实没什么差异
只是早期的编译器可能编译不过。 ...

你这没说在点子上。

我们应该充分利用编译器 检查功能。根据偏移检查。
原理大概就类似memcpy 里面那个aasertt 判断偏移

使用特权

评论回复
15
xlsbz|  楼主 | 2014-11-16 20:21 | 只看该作者
adce 发表于 2014-11-16 12:17
1.愿闻其区别...
2.
core_cm4.h

sizeof 我说的是这个意思  在一个文件夹下面定义

U8 TMP[10] = 0;那么在这个文件下sizeof[10]就等于10

如果 另一个文件extern U8 TMP[];
那么sizeof[TMP]就等于1.

一般情况下考虑咱们可能考虑通用型 只在一个文件下定义个宏 指出那个10.
所以就要注意

使用特权

评论回复
16
sedatefire| | 2014-11-16 20:22 | 只看该作者
xlsbz 发表于 2014-11-16 20:18
你这没说在点子上。

我们应该充分利用编译器 检查功能。根据偏移检查。

恩,如果执行
tmp[9] = xx;编译器是会报警的

但是,执行 tmp[index] = xxx, index=无穷大,编译器也不会报警。

使用特权

评论回复
17
sedatefire| | 2014-11-16 20:25 | 只看该作者
sedatefire 发表于 2014-11-16 20:22
恩,如果执行
tmp[9] = xx;编译器是会报警的

用 tmp[CONSTANT] = xx
这种写法,本身可扩展性差,可移植性也差
一般都是用
struct  TYPE *p = (struct  TYPE *)tmp;
p->var = xxx;
BigEndianToBuf(&p->yyy, xxx);
去搞的

使用特权

评论回复
18
xlsbz|  楼主 | 2014-11-16 20:30 | 只看该作者
sedatefire 发表于 2014-11-16 20:22
恩,如果执行
tmp[9] = xx;编译器是会报警的

嗯 我说的有点问题 看样子。 以前好像不报警啊。难道是编译器版本新了?

准确说法是

另一个文件 不报警

/* Includes ------------------------------------------------------------------*/
#include "microcb.h"

extern uint8_t   tmp[];

void test(void)
{
  tmp[30] = 0;
}

".\OBJ\firmware.axf" - 0 Error(s), 0 Warning(s).

使用特权

评论回复
19
xlsbz|  楼主 | 2014-11-16 20:31 | 只看该作者
sedatefire 发表于 2014-11-16 20:25
用 tmp[CONSTANT] = xx
这种写法,本身可扩展性差,可移植性也差
一般都是用

因为 在另一个文件不报警  所以我在一楼的说法仍然是利大于弊

使用特权

评论回复
20
xlsbz|  楼主 | 2014-11-16 20:35 | 只看该作者
sedatefire 发表于 2014-11-16 20:25
用 tmp[CONSTANT] = xx
这种写法,本身可扩展性差,可移植性也差
一般都是用

你跑题了

使用特权

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

本版积分规则

190

主题

1614

帖子

4

粉丝