ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1264594
bnb62 (02.12.2022 16:36, просмотров: 7126)
Согласился вдруг с расхожим: "выползти из ассемблера в Си без травм не получится". Так и будешь писать асм средствами Ц. :) Смотрю на чуждый код сокрушенно. Надо подобное сделать, но страшновато. Ладно макросы va_arg(), va_start() и va_end(), но там malloc(size), или если RTOS, pvPortMalloc(size)... Куда податься неучу? хбз. :( 
int8_t atc_command(atc_t *atc, const char *command, uint32_t timeout_ms, char *answer, uint16_t answer_size, int items, ...)

{

if (atc->inited == false)

return -1;

if (atc_lock(atc, timeout_ms) == false)

return -1;

if (answer != NULL)

memset(answer, 0, answer_size);

uint8_t foundIndex = 0;

va_list tag;

va_start(tag, items);

for (uint8_t i = 0; i < items; i++)

{

char *str = va_arg(tag, char*);

atc->searchCmd[i] = (char*) atc_alloc(strlen(str) + 1);

if (atc->searchCmd[i] != NULL)

{

strcpy(atc->searchCmd[i], str);

atc->searchCmd[i][strlen(str)] = 0;

}

if (items >= _ATC_SEARCH_CMD_MAX)

break;

}

va_end(tag);

atc_transmit(atc, (uint8_t*) command, strlen(command));

uint32_t start = HAL_GetTick();

while (HAL_GetTick() - start < timeout_ms)

{

atc_delay(1);

if (atc_available(atc))

{

atc_printf("[%s] %s", atc->name, (char* )atc->rxBuffer);

atc_search(atc);

char *found = atc_searchAnswer(atc, items, &foundIndex);

if (found != NULL && answer != NULL)

strncpy(answer, found, answer_size);

atc_empty(atc);

if (found != NULL)

break;

}

}

for (uint8_t i = 0; i < items; i++)

atc_free(atc->searchCmd[i]);

atc_unlock(atc);

return foundIndex;

}