Да. Можно и так. А можно и без структуры.pokk писал(а):Это будет так ?
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Да. Можно и так. А можно и без структуры.pokk писал(а):Это будет так ?
Да. Можно и так. А можно и без структуры.
Код: Выделить всё
typedef union {
int32_t my_long;
uint8_t my_byte[4];
} my_custom_long;
Код: Выделить всё
my_custom_long a,b,c;
uint8_t z;
...
a.my_long=1;
b.my_long=2;
...
c.my_long=a.my_long + b.my_long; \\ в 'c' получится 3
...
z=c.my_byte[3]; \\побайтовый доступ к 'c'
Нет, скорее так :pokk писал(а): Это будет так ?Код: Выделить всё
typedef struct { char b[3]; } U8long; U8long *u8 = (U8long*)h;
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
int main()
{
float pi=3.141593;
unsigned char c1,c2,c3,c4;
unsigned char *cptr=(unsigned сhar*)π
c1=cptr[0];c2=cptr[1];
c3=cptr[2];c4=cptr[3];
printf(" %.02X %.02X %.02X %.02X\n",c1,c2,c3,c4);
return(0);
}
Код: Выделить всё
__eeprom unsigned char eep_RCU_DC[N_BUTTONS]={
0x00, //[0] конпка 0
0x01, //[1] конпка 1
0x02, //[2] конпка 2
0x03, //[3] конпка 3
0x04, //[4] конпка 4
0x05, //[5] конпка 5
0x06, //[6] конпка 6
0x07, //[7] конпка 7
0x08, //[8] конпка 8
0x09, //[9] конпка 9};Код: Выделить всё
unsigned char RCU_Decoder(unsigned char* RCU_DC, unsigned char n_btn);А квалификатор "const" не толкает в EEPROM??aam писал(а):Допустим, есть массив:
Код: Выделить всё
struct uip_udp_conn *
uip_udp_new(u16_t *ripaddr, u16_t rport)
{}
struct uip_udp_conn *uip_udp_new(u16_t *ripaddr, u16_t rport);
struct uip_udp_conn {
u16_t ripaddr[2]; /**< The IP address of the remote peer. */
u16_t lport; /**< The local port number in network byte order. */
u16_t rport; /**< The remote port number in network byte order. */
};
Код: Выделить всё
struct uip_udp_conn *
uip_udp_new(u16_t *ripaddr, u16_t rport)
{
register struct uip_udp_conn *conn;
/* Find an unused local port. */
again:
++lastport;
if(lastport >= 32000) {
lastport = 4096;
}
for(c = 0; c < UIP_UDP_CONNS; ++c) {
if(uip_udp_conns[c].lport == lastport) {
goto again;
}
}
conn = 0;
for(c = 0; c < UIP_UDP_CONNS; ++c) {
if(uip_udp_conns[c].lport == 0) {
conn = &uip_udp_conns[c];
break;
}
}
if(conn == 0) {
return 0;
}
conn->lport = HTONS(lastport);
conn->rport = HTONS(rport);
conn->ripaddr[0] = ripaddr[0];
conn->ripaddr[1] = ripaddr[1];
return conn;
}Код: Выделить всё
for(uip_udp_conn = &uip_udp_conns[0];
uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS];
++uip_udp_conn) {
if(uip_udp_conn->lport != 0 &&
UDPBUF->destport == uip_udp_conn->lport &&
(uip_udp_conn->rport == 0 ||
UDPBUF->srcport == uip_udp_conn->rport) &&
BUF->srcipaddr[0] == uip_udp_conn->ripaddr[0] &&
BUF->srcipaddr[1] == uip_udp_conn->ripaddr[1]) {
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
goto udp_found;
}
}Код: Выделить всё
const __eeprom unsigned char eep_RCU_Light[N_BUTTONS]={0, 1....};Код: Выделить всё
unsigned char RCU_Decoder(unsigned char const __eeprom * RCU_DC, unsigned char n_btn);aam писал(а):А я в EEPROM именно хотел
Или я чет не понимаю??Psych писал(а):Iar константный массив кидает во флешь
Зачем искать? eep_RCU_Light -адрес первого элемента.aam писал(а): ато потом искать этот массив по всей проге
Код: Выделить всё
unsigned char RCU_Decoder( unsigned char const* RCU_DC, unsigned char n_btn);
const __eeprom unsigned char eep_RCU_Light[]={...};Код: Выделить всё
unsigned char RCU_Decoder( unsigned char const __eeprom* RCU_DC, unsigned char n_btn);Код: Выделить всё
unsigned char RCU_Decoder( unsigned char const* RCU_DC, unsigned char n_btn);
const unsigned char eep_RCU_Light[]={...};Имя массива это константный указатель(адресс известен), при вызове функции компилятор просто передаст число(адресс) в функцию.aam писал(а):если я напишу
unsigned char RCU_Decoder(__eeprom unsigned char* RCU_DC, unsigned char n_btn);
Не будет ли компилятор создавать сдуру промежуточный указатель в EEPROM и портить ресурс флешки при каждом вызове функции?
aam писал(а):Написал:
Код:
unsigned char RCU_Decoder( unsigned char const* RCU_DC, unsigned char n_btn);
const __eeprom unsigned char eep_RCU_Light[]={...};
Не катит
было интересно, насколько "законна" такая запись с точки зрения спецификации Си. Ато иногда компиляторы "имеют свое мнение", в частности, CodeVision этим славится в плане вычисления арифметических выражений дефайнов (правда там речь идет о препроцессоре)Psych писал(а):при вызове функции компилятор просто передаст число(адресс) в функцию
Код: Выделить всё
unsigned char RCU_Decoder( unsigned char const* RCU_DC, unsigned char n_btn);
const __eeprom unsigned char eep_RCU_Light[]={...};Код: Выделить всё
unsigned char RCU_Decoder( unsigned char const* RCU_DC, unsigned char n_btn);
const unsigned char eep_RCU_Light[]={...};Си не причем, это:aam писал(а):было интересно, насколько "законна" такая запись с точки зрения спецификации Си
К примеру:aam писал(а): компиляторы "имеют свое мнение"
А, все, понял...Psych писал(а):Че прям нет разницы??!!
Код: Выделить всё
unsigned char __eeprom * Adress;
unsigned char b; //параметр
__eeprom unsigned char eep_b; //его копия в EEPROM
Adress=&eep_b;
*Adress=b;
Код: Выделить всё
Error[e16]: Segment TINY_ID (size: 0x2a align: 0) is too long for segment definition. At least 0x2 more bytes needed.
The problem occurred while processing the segment placement command
"-Z(CODE)TINY_ID=_..X_FLASH_BASE-_..X_FLASH_END", where at the moment of placement the available memory
ranges were "CODE:7d8-7ff"
Reserved ranges relevant to this placement:
CODE:26-2e NEAR_F
CODE:2f-32 INITTAB
CODE:33-7d7 CODE
CODE:7d8-7ff TINY_ID
Error while running Linker Код: Выделить всё
20 bytes in segment ABSOLUTE
1 374 bytes in segment CODE
31 bytes in segment EEPROM_I
4 bytes in segment INITTAB
6 bytes in segment INTVEC
9 bytes in segment NEAR_F
38 bytes in segment TINY_I
38 bytes in segment TINY_ID
1 421 bytes of CODE memory (+ 10 bytes shared)
38 bytes of DATA memory (+ 20 bytes shared)
31 bytes of XDATA memory
Errors: none
Warnings: none
Ну, можно попробовать выбрать в настройках (у Вас же IAR?) опцию agressive inlining (кажется, так называется).как заставить компилятор гарантированно подставлять inline-функцию?