Вс мар 04, 2018 12:53:20
когда в .data уже 0, а в .text ещё место есть и можно заколоть корову эффективности, чтобы вымолить пару байт на данные.
Так что, несите людям знания, а не молитвы.
Вс мар 04, 2018 13:07:41
когда в .data уже 0, а в .text ещё место есть и можно заколоть корову эффективности, чтобы вымолить пару байт на данные.
Вс мар 04, 2018 13:25:03
99% аудитории хочет видеть конкретные ответы на интересующие их вопросы, да и только.
Двух слов .data и .text - sapienti sat, чтобы понять о чём речь. У вас пробел в знаниях.
Т.е. на моей актуальной платформе RX63N + 32 MB etx. SDRAM ваша аксиома о всегдашности использования упаковки структур принесёт что-то кроме замусоривания кода - это выдумка?
Вс мар 04, 2018 13:50:38
for (key_number = 0; key_number < 8; key_number++, keys_code >>=1)
Вс мар 04, 2018 14:52:39
for (keys_byte = 0; keys_byte < 4; keys_byte++) // Будем читать 4 байта состояний кнопок
{
spi_put(0);
spi_wait();
keys_code |= (TM1638_convert_byte(spi_get()))<<keys_byte; // Каждый следующий байт накладывается на предыдущий со сдвигом влево на величину порядкового номер принятого байта (начиная с 0 !!!)
}
uint8_t TM1638_get_keys(void)
{
uint8_t keys_code = 0,keys_byte,key_number;
TM1638_STB_LOW();
TM1638_write_byte(TM1638_CMD_READ_KEYS);
// _delay_us(2); // Минимально необходимая по даташиту задержка 2 мкс - можно убрать, все равно есть задержка после поднятия CLK в процедуре записи байта
#ifdef USE_USI_FOR_TM1638
half_spi_init_receive(); // Init SPI driver as RECEIVED master.
#else
TM1638_DIO_INPUT(); // Установим ногу на вход !!!
#endif
#ifdef USE_USI_FOR_TM1638
for (keys_byte = 0; keys_byte < 4; keys_byte++) // Будем читать 4 байта состояний кнопок
{
spi_put(0);
spi_wait();
keys_code |= (TM1638_convert_byte(spi_get()))<<keys_byte; // Каждый следующий байт накладывается на предыдущий со сдвигом влево на величину порядкового номер принятого байта (начиная с 0 !!!)
}
#else
uint8_t key_code = 0;
for (keys_byte = 0; keys_byte < 4; keys_byte++) // Будем читать 4 байта состояний кнопок
{
for (key_number = 0; key_number < 8; key_number++) // Перебор всех кнопок этого байта
{
TM1638_CLK_LOW();
_delay_us(TM1638_DELAY_US);
TM1638_CLK_HIGH();
if (TM1638_DIO_READ()) // Если есть нажатая кнопка
{
key_code |= (1<<key_number); // Устанавливаем бит нужной кнопки
keys_code |= key_code<<keys_byte; // и накладываем этот байт на предыдущий со сдвигом влево на величину порядковго номера принятого байта (начиная с 0 !!!)
}
_delay_us(TM1638_DELAY_US);
}
}
#endif
TM1638_STB_HIGH();
#ifdef USE_USI_FOR_TM1638
half_spi_reinit_transmit(); // Init SPI driver as TRANSMIT master.
#else
TM1638_DIO_OUTPUT(); // Вернем ногу на выход !!!
#endif
_delay_us(TM1638_DELAY_US);
TM1638_send_comm(TM1638_CMD_SET_DATA | TM1638_SET_DATA_F_ADDR); // Установка режима работы - Запись в индикатор, Фиксированный адрес
_delay_us(TM1638_DELAY_US);
#ifdef RETURN_KEY_NUMBER
if (keys_code) // Если нажата кнопка - вычисляем ее номер (Внимание, будет передана только 1, самая младшая кнопка !!!)
{
for (key_number = 0; key_number < 8; key_number++, keys_code >>=1)
{
if (keys_code & 0x01) // Если 0 бит установлен, найдена нажатая кнопка (Внимание, первой будет найдена кнопка из младшего бита)
{
return key_number+1; // Возвращаем порядковый номер первой найденой нажатой кнопки
}
}
}
#endif
return keys_code; // Возвращаем состояние всех кнопок
}
Вс мар 04, 2018 15:27:48
Пн мар 05, 2018 01:30:55
for (p0 = Font2[C].Line, p = Font2[C].Line + 1; 0 == p->eol; p0 = p, p++)
Пн мар 05, 2018 06:55:09
Пн мар 05, 2018 06:58:13
a value of type "const t_point *" cannot be assigned to an entity of type "t_point *"
Пн мар 05, 2018 11:54:06
#define MAX_CHAR_DATA 32
// [омномномном]
// при таком способе инициализации данные массива добиваются нулями до размера 32 (MAX_CHAR_DATA)
t_point ch56[MAX_CHAR_DATA] = { 0x10, 0x30, 0x41, 0x42, 0x33, 0x44, 0x45, 0x36, 0x16, 0x05, 0x04, 0x13, 0x02, 0x01, 0x10, BRK, 0x13, 0x33, EOL } ;
// [омномномном]
const struct TFont {
t_point *Line;
} Font[255] = {
ch00, ch01, ch02, и.т.д, и т.д..... , ch56, ch57,
};
Пн мар 05, 2018 19:23:02
Ср мар 07, 2018 05:07:54
uint8_t IP[4]={192,168,0, 6};
SetIP(RAM_SettingAllVar.WiznetSetting.ip,IP);
void SetIP(uint8_t* src,uint8_t* ip){
src[0]=ip[0];
src[1]=ip[1];
src[2]=ip[2];
src[3]=ip[3];
}
SetIPv2(RAM_SettingAllVar.WiznetSetting.ip,0xC0A80006);
Ср мар 07, 2018 08:15:32
typedef union{
uint32_t ip_long;
struct{
uint8_t ip_b0,ip_b1,ip_b2,ip_b3;
}
} ip_t;
Ср мар 07, 2018 12:56:48
#define IPV4_ADDR(a,b,c,d) (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | \
((uint32_t)(c) << 8) | ((uint32_t)(d) << 0))
IPV4_ADDR (192, 168, 0, 6)
Ср мар 14, 2018 07:44:54
#include "Aplication.h"
#include "Ethernet\SNMP\snmp.h"
extern dataEntryType snmpData[];
#ifndef SNMP_H_
#define SNMP_H_
Ср мар 14, 2018 09:49:09
#ifndef __H__
#define __H__
struct dataEntryType; // forward declaration
int cleanThemAll(struct dataEntryType*); // указатель на тип - подробности внутренностей объекта не нужны
#endif /* __H__ */
Ср мар 14, 2018 16:57:46
Ср мар 14, 2018 17:10:30
Чт мар 22, 2018 18:00:38
// вот две функции
void output_level_1_GWS(void);
void output_level_1_HWS(void);
// объявляю тип структуры с полями на указатель функции
typedef struct
{
void (*Ptr1GWS)(void); // пункт меню на первом уровне
void (*Ptr1HWS)(void); // пункт меню на первом уровне
}LEVEL1; // тип структуры 1 уровня
//инициализирую ее функциями выше
LEVEL1 MENU_LEVEL1={output_level_1_GWS,output_level_1_HWS};
// создаю указатель на целое беззнаковое
uint8_t *PtrPunkt;
в него планирую поместить адрес 2 поля структуры LEVEL1 MENU_LEVEL1.Такой вот записью PtrPunkt=&(LEVEL1 MENU_LEVEL1->Ptr1HWS);
1)нужен ли здесь указатель на указатель? :dont_know:
2)затем используя PtrPunkt нужно вызвать функцию output_level_1_HWS();Правильно ли будет написав так *PtrPunkt;
3)объявления переменных, функции и т.п делаю в хедере, а инициализацию нужно делать в исходнике модуля как и реализацию функции, или в хедере?
Чт мар 22, 2018 18:29:15
// вот две функции
void output_level_1_GWS(void);
void output_level_1_HWS(void);
// sz: делаем каноничненько - алиасим тип указателя на функцию
typedef void (*TvvPtr)(void);
// объявляю тип структуры с полями на указатель функции
typedef struct {
TvvPtr Ptr1GWS; // пункт меню на первом уровне
TvvPtr Ptr1HWS; // пункт меню на первом уровне
} LEVEL1; // тип структуры 1 уровня
// создаю указатель на целое беззнаковое
uint8_t *PtrPunkt; // sz: когда устанете бороться с компилятором - напишите так: TvvPtr PtrPunkt;
PtrPunkt=&(LEVEL1 MENU_LEVEL1->Ptr1HWS); // sz: не выйдет в мышь впихнуть кота - любой заметит: - "Фактура не та!" А приведение типов - Зло™. Синтакс - ужасен - достаточно PtrPunkt=MENU_LEVEL1->Ptr1HWS;
// sz: да и за полностью прописные имена типов/переменных и прочих не #define-ов - тру-Сишники из вас кактус сделают. :-) Ибо заповедано: -"Прописными - только #define-ы!"
2)затем используя PtrPunkt нужно вызвать функцию output_level_1_HWS();Правильно ли будет написав так *PtrPunkt;
// sz: а если-бы функция имела аргументы? И таблицу приоритетов посмотрите - кто кого перетянет. ;-)
3)объявления переменных, функции и т.п делаю в хедере, а инициализацию нужно делать в исходнике модуля как и реализацию функции, или в хедере?
// sz: "хидер" - это интерфейс модуля - там объявления, А определения - только в самом модуле. Будь определение в хидере - в каждом включающем этот хидер модуле будет копия переменной - линкер может и заколдобиться.