Vladimir Ljaschko (23.03.2013 12:56, просмотров: 199) ответил SciFi на В смысле "не нужно подсказывать компилятору, как генерить более оптимальный код"? Другими словами, "ресурсы таки на пределе, надо брать камень пожирнее" :-)
Ни фига не на пределе, просто использую макросы + инлайны вместо того, чтобы писать а-ля ассемблер. Например вот так. Имею право? Хочу им пользоваться! :)
/* name var bit */
FLAG ( eeprom_good ,flags, 0x0001U )
FLAG ( low_power_enable ,flags, 0x0002U )
FLAG ( factory_flag ,flags, 0x0004U )
FLAG ( service_calibration ,flags, 0x0008U )
FLAG ( remote ,flags, 0x0010U )
FLAG ( show_value ,flags, 0x0020U )
FLAG ( blink ,flags, 0x0040U )
FLAG ( missing_pulses ,flags, 0x0080U )
FLAG ( remote_change_enabled ,flags, 0x0100U )
FLAG ( booster_filled ,flags, 0x0200U )
FLAG ( refilling ,flags, 0x0400U )
FLAG ( conc_change_enable ,flags, 0x0800U )
FLAG ( delivery_passive ,flags, 0x1000U )
FLAG ( start_user_menu ,flags, 0x2000U )
FLAG ( process_happened ,flags, 0x4000U )
FLAG ( feed_bin_filled ,flags, 0x8000U ) // Type K
FLAGS_VARIABLE ( flags )
#pragma inline=forced
uint GetFlag(uint name);
#pragma inline=forced
void OnFlag(uint name);
#pragma inline=forced
void OffFlag(uint name);
#pragma inline=forced
void ToggleFlag(uint name);
/* enumeration of flags */
enum {
#define FLAG( name, var, bit) name,
#define FLAGS_VARIABLE(var)
#include "k__flags.h"
#undef FLAG
#undef FLAGS_VARIABLE
};
/* generation of flag bits masks */
#define FLAG( name, var, bit) enum { m_##name=(bit)};
#define FLAGS_VARIABLE(var)
#include "k__flags.h"
#undef FLAG
#undef FLAGS_VARIABLE
/* generation of extern var */
#define FLAG(name, port, bit)
#define FLAGS_VARIABLE(var) extern volatile unsigned int var;
#include "k__flags.h"
#undef FLAG
#undef FLAGS_VARIABLE
// generation of GET functions
unsigned int GetFlag( unsigned int name)
{ switch (name) {
#define FLAG( name, var, bit) case name: return (var & bit);
#define FLAGS_VARIABLE(var)
#include "k__flags.h"
#undef FLAG
#undef FLAGS_VARIABLE
default: return 0; } }
// generation of ON flag
void OnFlag( unsigned int name)
{ switch (name) {
#define FLAG(name, var, bit) case name: var|=bit; return;
#define FLAGS_VARIABLE(var)
#include "k__flags.h"
#undef FLAG
#undef FLAGS_VARIABLE
}}
// generation of OFF flag
#pragma diag_suppress=Pe068
void OffFlag( unsigned int name)
{ switch (name) {
#define FLAG(name, var, bit) case name: var&=~bit; return;
#define FLAGS_VARIABLE(var)
#include "k__flags.h"
#undef FLAG
#undef FLAGS_VARIABLE
}}
#pragma diag_warning=Pe068
// generation of TOGGLE output functions
void ToggleFlag( unsigned int name)
{ switch (name) {
#define FLAG(name, var, bit) case name: var^=bit; return;
#define FLAGS_VARIABLE(var)
#include "k__flags.h"
#undef FLAG
#undef FLAGS_VARIABLE
}}