Ви не увійшли.
всем привет, есть проблема которую не знаю как решать,
у гугла бы спросил, да как правильно вопрос поставить непонятно
есть у меня описание структуры
typedef struct {
char * CMD;
TE_TYPE_CONFIG_CMD COMMAND;
TFunctionStatus (*flow_)(unsigned long ID);
} TD_TEXT_CMD;
например так
const TD_TEXT_CMD TEXT_CMD [ ] =
{
{ "HELLO" ,COMMAND_HELLO, flow_command_hello },
...
}
после добавление 4 новых команд
ошибка компиляции
50: error: 'flow_cmd_hello' undeclared here (not in a function)
51: error: 'flow_cmd_*************' undeclared here (not in a function)
52: error: 'flow_cmd_*************' undeclared here (not in a function)
53: error: 'flow_cmd_*************' undeclared here (not in a function)
все работает(ло) , но с некоторых времен добавление новых функций , напрмер:
новая функция flow_command_hello которую добавил к > 50 командам не компилится, показывает ошибку - не видит тут ( в данном случае здеся (иных слов нет) ) функцию, которая отлично видится и вызывается без каких либо варнингов ,
итого - новые команды работают, только если только ручками вызываю их обработку
ключи
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -ffunction-sections -g -O0 -c -DSTM32F103VET6 -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER -D__ASSEMBLY__ -DSTM32F103VE -D
по сути,
что то не учел, если кто знает причину - маякните плс
sizeof(TEXT_CMD) 936b , уменьшение кол. ячеек в TEXT_CMD не помогает.
просто не работает добавление новых функций в данную структуру
add
flow_command_hello расположена в файле со структурой, так же не вызывает никаких вопросов у GNU Tools ARM Embedded 4.9 2015q1
add
папку "дебажную" удалял.
add
CooCox CoIDE
Version: 1.7.8
Build id: 20150206-3334-1557
CooCox CoIDE is a free software product.
Остання редакція NoName (2016-10-27 13:12:40)
Неактивний
через "попу" решается так
TFunctionStatus flow_cmd_hello ( unsigned long ID );
const TD_TEXT_CMD TEXT_CMD [ ] =
{
{ "HELLO" ,COMMAND_HELLO, flow_command_hello },
...
}
сама же функция в нужном файле, но неприятный осадок остался.
Неактивний
Непонял, что такое
TFunctionStatus flow_cmd_hello
А все остальное работает:
typedef int TE_TYPE_CONFIG_CMD ;
typedef struct {
char *CMD;
TE_TYPE_CONFIG_CMD COMMAND;
float TFunctionStatus;
// TFunctionStatus (*flow_)(unsigned long ID);
}TD_TEXT_CMD;
float flow_command_hello1,flow_command_hello2,flow_command_hello3,flow_command_hello4,flow_command_hello5,flow_command_hello6;
int COMMAND_HELLO1=1;
int COMMAND_HELLO2=2;
int COMMAND_HELLO3=3;
int COMMAND_HELLO4=4;
int COMMAND_HELLO5=5;
int COMMAND_HELLO6=6;
const TD_TEXT_CMD TEXT_CMD[] =
{
{"HELLO1" ,COMMAND_HELLO1, flow_command_hello1 },
{"HELLO2" ,COMMAND_HELLO2, flow_command_hello2 },
{"HELLO3" ,COMMAND_HELLO3, flow_command_hello3 },
{"HELLO4" ,COMMAND_HELLO4, flow_command_hello4 },
{"HELLO5" ,COMMAND_HELLO5, flow_command_hello5 },
{"HELLO6" ,COMMAND_HELLO6, flow_command_hello6 }
};
void setup() {
// put your setup code here, to run once:
int i;
Serial.begin(9600);
for (i=0; i<6; i++)
{
Serial.print(TEXT_CMD[i].CMD);Serial.print("=");Serial.println(TEXT_CMD[i].COMMAND);
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Неактивний
привет, с этим рекомендую разобраться
пример от ESP8266
at_funcationType at_fun[at_cmdNum]={
{NULL, 0, NULL, NULL, NULL, at_exeCmdNull},
{"E", 1, NULL, NULL, at_setupCmdE, NULL},
{"+RST", 4, NULL, NULL, NULL, at_exeCmdRst},
{"+GMR", 4, NULL, NULL, NULL, at_exeCmdGmr},
{"+GSLP", 5, NULL, NULL, at_setupCmdGslp, NULL},
{"+IPR", 4, NULL, NULL, at_setupCmdIpr, NULL},
...
}
где
typedef struct
{
char *at_cmdName;
int8_t at_cmdLen;
void (*at_testCmd)(uint8_t id);
void (*at_queryCmd)(uint8_t id);
void (*at_setupCmd)(uint8_t id, char *pPara);
void (*at_exeCmd)(uint8_t id);
}at_funcationType;
использование at_funcationType at_fun[at_cmdNum]
в одной структуре описали все доступные вызовы, и условия вызова.
я храню возможность вызова как крайний метод для уменьшения кода,
когда нет смысла урезать код пользуюсь как возможность быстрого перехода на необходимую функцию
CNTR + мышкой клик на имени функции, нереально удобно )))
в среде ардуино не работает (((
но я где то встречал можно прикрутить компилятор к более удобной оболочке, с сохранением всем "моментов" ардуино.
пример
void ICACHE_FLASH_ATTR
at_cmdProcess(uint8_t *pAtRcvData)
{
char tempStr[32];
int16_t cmdId;
int8_t cmdLen;
uint16_t i;
cmdLen = at_getCmdLen(pAtRcvData);
if(cmdLen != -1)
{
cmdId = at_cmdSearch(cmdLen, pAtRcvData);
}
else
{
cmdId = -1;
}
if(cmdId != -1)
{
// os_printf("cmd id: %d\r\n", cmdId);
pAtRcvData += cmdLen;
if(*pAtRcvData == '\r')
{
if(at_fun[cmdId].at_exeCmd)
{
at_fun[cmdId].at_exeCmd(cmdId);
}
else
{
at_backError;
}
}
else if(*pAtRcvData == '?' && (pAtRcvData[1] == '\r'))
{
if(at_fun[cmdId].at_queryCmd)
{
at_fun[cmdId].at_queryCmd(cmdId);
}
else
{
at_backError;
}
}
else if((*pAtRcvData == '=') && (pAtRcvData[1] == '?') && (pAtRcvData[2] == '\r'))
{
if(at_fun[cmdId].at_testCmd)
{
at_fun[cmdId].at_testCmd(cmdId);
}
else
{
at_backError;
}
}
else
if(((*pAtRcvData >= '0') && (*pAtRcvData <= '9'))||(*pAtRcvData == '='))
{
if(at_fun[cmdId].at_setupCmd)
{
at_fun[cmdId].at_setupCmd(cmdId, pAtRcvData);
}
else
{
// uart0_sendStr("no this fun\r\n"); //Relax, it's just a code.
at_backError;
}
}
else
{
at_backError;
}
}
else
{
at_backError;
}
}
AT+IPR=0
нашли "+IPR"
{"+IPR", 4, NULL, NULL, at_setupCmdIpr, NULL},
"+IPR=" удовлетворяет (*pAtRcvData == '='))
функия at_setupCmdIpr не NULL?
вызвали ее
at_fun[cmdId].at_setupCmd(cmdId, pAtRcvData);
if(at_fun[cmdId].at_setupCmd)
{
at_fun[cmdId].at_setupCmd(cmdId, pAtRcvData);
}
в целом по коду ESP8266 неоднозначное мнение у меня,
но самое главное - разраб молодец, мне его стиль наверное просто не привычен.
таких фичь при использовании Си много, если что найдете интересное - скидывайте )
Неактивний