标签: c51

为什么使用数据而不是xdata会显着减少代码空间

我试图寻找答案,但找不到明确的理由.

我正在尝试优化一些8051 C代码以减少代码空间.我做了以下改变..

xdata unsigned char a, b;
Run Code Online (Sandbox Code Playgroud)

data unsigned char a, b;
Run Code Online (Sandbox Code Playgroud)

...并且看到我的代码大小减少了39Bytes(感觉像圣诞节).

来自:程序大小:数据= 9.0 ...代码= 10509

to:程序大小:data = 11.0 ... code = 10468

问题:为什么代码空间减少了这么小的变化?

c optimization 8051 c51

5
推荐指数
1
解决办法
499
查看次数

array [] vs pointer* - 为什么第一个代码在C中失败?

我正在使用Keil C51编译器来编程8051微控制器.由于某些原因,我的代码没有运行 - 我设法追踪错误,但我仍然难以理解它.为什么第一个代码与另一个代码相比是错误的?值得注意的是,编译器没有抛出任何错误,代码甚至没有在微控制器上启动.

错误的代码:

file1.h

extern STRUCT_TYPEDEF array_var[];
Run Code Online (Sandbox Code Playgroud)

file2.c中

// Global variable initialization
STRUCT_TYPEDEF array_var[] = some_struct.array2_var;
Run Code Online (Sandbox Code Playgroud)

将这些更改为:

file1.h

extern STRUCT_TYPEDEF *array_var;
Run Code Online (Sandbox Code Playgroud)

file2.c中

// Global variable initialization
STRUCT_TYPEDEF *array_var = &some_struct.array2_var[0];
Run Code Online (Sandbox Code Playgroud)

它开始工作了.

此外,这部分代码仅在类似"array_var [0] .property = ..."的函数中引用,但这些函数都没有从应用程序中调用过.

some_struct变量在另一个模块中声明.

它为什么会这样?[]和*之间有什么区别我不知道吗?

EDIT1: 据说指针和数组是不同的东西......但是,"[]"语法与"*"的区别是什么?我认为只要方括号为空(例如函数参数),编译器就会将其转换为指针.我还认为提供一个数组会导致给我第一个元素的地址.

现在,每个人都在说指针和数组是不同的 - 但我找不到任何关于它们究竟有什么不同的信息.当我将数组作为rvalue而不是指向其第一个元素的指针时,编译器如何看待它?

c arrays pointers keil c51

2
推荐指数
1
解决办法
982
查看次数

除了避免错误之外的const参数的目的

我正在使用keil C51 C编译器编程8051微控制器,它只支持C90.

我想通过UART发送一个字节的数据,函数如下所示:

void Uart_send(char data){
   //...
}
Run Code Online (Sandbox Code Playgroud)

使用1:

char a = 123;
Uart_send(a); //work great
Run Code Online (Sandbox Code Playgroud)

使用2:

Uart_send(123);//doesn't work, but no error or warning from compiler
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,发送1个字节,但不是正确的值(123).

如果我将我的代码更改为:

void Uart_send(const char data){
   //...
}
Run Code Online (Sandbox Code Playgroud)

一切都很完美.

根据我的理解和互联网上的几个来源,"const"的唯一目的是防止函数改变其参数(换句话说,防止程序员错误地改变参数).那为什么我的第二种方法不起作用?

编辑:这是我的完整代码:

UART.h

typedef struct {
    char Buffer[10];
    char *p;
    char Ready;
    void (*Load)(char Data);
    void (*Transmit)();
    void (*Flush)();
} _uart;
extern _uart UART;
Run Code Online (Sandbox Code Playgroud)

UART.c

#include "UART.h"
#include <reg51.h>

#define EOF 0x00
/*
0000_0000: EOF
0000_0001: countdown
1xxx_xxxx: primary time set
1xxx_xxxx: secondary time …
Run Code Online (Sandbox Code Playgroud)

c keil c51

1
推荐指数
1
解决办法
58
查看次数

标签 统计

c ×3

c51 ×3

keil ×2

8051 ×1

arrays ×1

optimization ×1

pointers ×1