Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS - минимальное время тика?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Страницы: 1, 2, 3
Arlleex
Ну вроде в порядке все, только определены ли у Вас функции-ловушки всех установленных опций? Я про IdleHook, TickHook и т.д.
Как проверяете, что RTOS не переключается на задачу с самым высоким приоритетом?
maxntf
Цитата(Arlleex @ May 31 2018, 17:05) *
Ну вроде в порядке все, только определены ли у Вас функции-ловушки всех установленных опций? Я про IdleHook, TickHook и т.д.

Код
void vApplicationIdleHook(void)
{
    //HOOK_PULSE;
}
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
{
    for(;;);
}
void vApplicationTickHook(void)
{
    
}
void vApplicationMallocFailedHook(void)
{
    for(;;);
}

#define HOOK_PULSE GPIO_ToggleBits(GPIOB, GPIO_Pin_5) - это вывод пина на осциллограф, когда нужно что то проверить. А так они IdleHook, TickHook пока у меня пустые.
Цитата(Arlleex @ May 31 2018, 17:05) *
Как проверяете, что RTOS не переключается на задачу с самым высоким приоритетом?

Шагаю по прерыванию, а после выхода из обработчика прерывания вываливаюсь в Task2 (точнее в тело функции которую она периодически вызывает) с низким приоритетом (приоритет 1) а Task1 который ждет семафор (только у меня событие из очереди) приоритет 2.
Arlleex
Код
xQueuePeek(xQueue, &q_buf, 10);
    taskENTER_CRITICAL();
        ctim10ms = newValue - cal_ctim10ms;
        cal_ctim10ms = 0;
    taskEXIT_CRITICAL();
        GPIO_ToggleBits(GPIOB, GPIO_Pin_5);//пин контроля работы программы
        xQueueReceive(xQueue, &q_buf, 0);

А зачем два раза подряд вызывать ожидающие функции xQueuePeek() и xQueueReceive() причем подряд?
Как-то не корректно Вы с очередью работаете...
xQueuePeek() считает значение из очереди, но не удалит его оттуда.
xQueueReceive() тоже считает, но удалит (FIFO).
Почему просто не вызывать xQueueReceive()?
maxntf
Цитата(Arlleex @ May 31 2018, 18:05) *
А зачем два раза подряд вызывать ожидающие функции xQueuePeek() и xQueueReceive() причем подряд?
Как-то не корректно Вы с очередью работаете...
xQueuePeek() считает значение из очереди, но не удалит его оттуда.
xQueueReceive() тоже считает, но удалит (FIFO).
Почему просто не вызывать xQueueReceive()?

Таймер тикает очень часто. Пока я в задаче после разблокировки дойду до установки счетчика (в примере не весь код, я его упростил) в новое значение, он может тикнуть еще несколько раз, по этому в это время (по не удается установить новое событие), наполняется счетчик калибровки, который я отнимаю от нового устанавливаемого значения.

И вообще я как бы уже понял что и как нужно делать, вся моя затея была концептуально не верна. Но вылезло много глюков с которыми и разбираюсь, почему так получается, чтоб потом не наступать на подобные грабли.
По этому просьба больше не писать что я туплю и делаю не так, это не проект а тесты.

В частности сейчас у меня проблема, что не работает portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
Докопался portYIELD(), понял что он устанавливает флаг прерывания PendSV, в котором ОС выполняет переключение контекста.

А теперь о моих баранах. В Task2(с низким приоритетом) у меня вызывается функция F1() с той самой тачлиб что фигурировала в начале темы. Так вот после выхода из обработчика прерывания в котором вызывался portEND_SWITCHING_ISR(xHigherPriorityTaskWoken), программа попадает в место из картинки. Получается что флаг прерывания PendSV был установлен когда судя по записи __disable_irq() все прерывания били отключены.



Убрал нафиг эти __disable_irq() и __enable_irq(). Но все равно не работает.

Как бы в отладчике узнать включено ли прерывание для PendSV?

P.S.
Кстати у меня с калибровкой на 10мкс все работало четко, только потому, что не переключается контекст и время на это не тратится и все успевает. Вот так бывает sm.gif
Forger
Цитата(maxntf @ Jun 1 2018, 12:18) *
По этому просьба больше не писать что я туплю и делаю не так.

Дык, тогда и не пишите тут то, что вызывает такую реакцию, кстати, вполне естественную реакцию laughing.gif

зы. "По этому" в данном случае пишется слитно biggrin.gif

maxntf
Цитата(Forger @ Jun 1 2018, 13:39) *
Дык, тогда и не пишите тут то, что вызывает такую реакцию, кстати, вполне естественную реакцию


Так вот...
Упростил как мог, все выкинул никаких тачлибов и всего остального, только 2 задачи.
Код
xSemaphoreHandle xSem1ms;    
volatile uint32_t ctim100us;    
uint8_t FlagCreateTask;
void TIM10_IRQHandler(void)
{
    static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
    
    if(TIM_GetFlagStatus(TIM10, TIM_FLAG_Update) != RESET)
    {
        TIM_ClearFlag(TIM10, TIM_FLAG_Update);
        if(ctim100us) ctim100us--;
        else
        {
            xSemaphoreGiveFromISR(xSem1ms, &xHigherPriorityTaskWoken);
            portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
        }
    }
}
int main(void)
{    
    xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL);    
    vTaskStartScheduler();
}
void Task2(void *pParams)
{

    FlagCreateTask = 0;
    vSemaphoreCreateBinary(xSem1ms);

    xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
    while(1)
    {
        if(FlagCreateTask != 0) continue;
        xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
    }
}
void Task1(void *pParams)
{
    uint16_t count = 3;

    xSemaphoreTake(xSem1ms, 0);
    FlagCreateTask = 1;

    ctim100us = count;
    Tx_Init();

    while(1)
    {
        if(xSemaphoreTake(xSem1ms, 10) != pdTRUE) continue;
        count++;
        if(count > 9) break;
    taskENTER_CRITICAL();
        ctim100us = count;
    taskEXIT_CRITICAL();
        GPIO_ToggleBits(GPIOB, GPIO_Pin_5);//пин контроля работы программы
    }
    TIM_DeInit(TIM10);
    FlagCreateTask = 0;
    vTaskDelete(NULL);
}


После выхода из обработчика прерывания TIM10 в случае выполнения portEND_SWITCHING_ISR(xHigherPriorityTaskWoken) программа попадает в Task2.
О Боже, за что?
Даже таймер настроен на 100мкс
Forger
Цитата(maxntf @ Jun 1 2018, 13:53) *
Так вот...

Судя по всему, у обеих задач одинаковые приоритеты.
А Task2 вообще ВСЕГДА готова к выполнения.
Т.е. всегда что-то делает...
Более того, честно говоря, я чуть моск не сломал, пока попытался понять логику работы "флажка" FlagCreateTask wacko.gif
Так нифига и не понял, что вы задумали (((

А вообще, прочитайте, наконец, нормальный мануал, как писать проекты под RTOS, посмотрите видео на ютубе, примеры из мануала и т. п.
Посмотрите примеры применения, конкретные рабочие примеры. Желательно это делать перед тем, как плодить франкешнейнов самодеятельность, и уж тем более тут это публиковать wink.gif

FreeRTOS запускается с полпинка и работает как и любая друга RTOS, но необходимы хотя бы базовые знания. Решите сначала этот вопрос!
Уверяю, ничего сверхсложного тут нет, все через это прошли ))

Немного упрощу задачу. Вот яркий пример откровенной самодеятельности:
Код
    while(1)
    {
        if(FlagCreateTask != 0) continue;
        xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
    }

maxntf
Цитата(Forger @ Jun 1 2018, 14:08) *
Судя по всему, у обеих задач одинаковые приоритеты.


Судя по чему конкретно?
Код
xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);


Цитата(Forger @ Jun 1 2018, 14:08) *
А вообще, прочитайте, наконец, нормальный мануал, как писать проекты под RTOS...


Какие проекты, я про конкретный случай спрашиваю.
Убрал то, что моск ломает.
Код
void Task2(void *pParams)
{
    vSemaphoreCreateBinary(xSem1ms);
    xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
    while(1);
}
void Task1(void *pParams)
{
    xSemaphoreTake(xSem1ms, 0);
    ctim100us = 10;
    Tx_Init();
    xSemaphoreTake(xSem1ms, 10);    
    TIM_DeInit(TIM10);
    vTaskDelete(NULL);
}


Если задачи с одинаковым приоритетом, почему? Может где то настройки FreeRTOS?
Если Task2 всегда готова к выполнению, то когда срабатывает portEND_SWITCHING_ISR(xHigherPriorityTaskWoken) разве после выхода из прерывания контекст не должен переключится с Task2 на Task1?
Forger
Цитата(maxntf @ Jun 1 2018, 14:34) *
Код
xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);

Исходя из мануала
Task1 имеет приоритет выше, чем Task2. Признаю, тут я не доглядел (( .... Ненавижу функции с числом параметров больше одного-двух - невозможно разобраться без мануала sad.gif

Цитата
Убрал то, что моск ломает.
Уже проще wink.gif

Цитата
Может где то настройки FreeRTOS?
Еще раз на всякий случай приведите настройки (в теге CODEBOX).
maxntf
Цитата(Forger @ Jun 1 2018, 14:46) *
Еще раз на всякий случай приведите настройки (в теге CODEBOX).

Для проверки работы приоритетов поменял приоритеты задач - программа в Task1 вообще не попадает, значит приоритеты работают.
CODE


#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configCPU_CLOCK_HZ ( SystemCoreClock )
#define configUSE_PREEMPTION 1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 5
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 1

/* Software timer related definitions. */
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
#define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1

/* Standard assert semantics. */
//#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

/* Use the system definition, if there is one */
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 /* 15 priority levels */
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/* The lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* Priority 5, or 95 as only the top four bits are implemented. */
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

/* Run time stats related macros. */
#define configGENERATE_RUN_TIME_STATS 0

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */
Forger
Создайте сразу две задачи (можно с разными приоритетами),
воткните в бесконечный цикл каждой задачи что-нибудь для постановки ее в очередь ожидания, например sleep(1) (или что там используется у freertos).

Поставьте по одному бряку внутри задач 1 и 2 и см. как идет процесс переключения задач.

Они должны переключаться по очереди.

Далее добавляйте свой код по чуть-чуть и смотрите, что сыпется от него.
maxntf
Похоже отладчик всему беда.
Вывел сигнал с прерывания таймера на осциллограф, по количеству тактов определил что все работает нормально.
Forger
Цитата(maxntf @ Jun 1 2018, 18:21) *
Похоже отладчик всему беда.

Что же за отладчик такой, если не секрет?
maxntf
Цитата(Forger @ Jun 1 2018, 20:06) *
Что же за отладчик такой, если не секрет?

Тот что в Keil.
Причем только в пошаговом режиме кнопками Step или Step Over при выходе из обработчика прерываний.
А если поставить брекпоинты в задачах, и выйти из прерывания Step Out или Run тогда попадаем куда нужно, то есть в Task2.
Forger
Цитата(maxntf @ Jun 2 2018, 15:04) *
Тот что в Keil.
Причем только в пошаговом режиме кнопками Step или Step Over при выходе из обработчика прерываний.
А если поставить брекпоинты в задачах, и выйти из прерывания Step Out или Run тогда попадаем куда нужно, то есть в Task2.

Оптимизацию отключите, хотя бы для debug сборки. При пошаговой отладке она только вредит.
Или как вариант - ходить не по C/C++ исходникам, а в по командам в окне disasm.

И вообще, изучайте инструмент, а то вон 8 страниц наплодили по сути на пустом месте sm.gif
maxntf
Цитата(Forger @ Jun 2 2018, 15:17) *
Оптимизацию отключите, хотя бы для debug сборки. При пошаговой отладке она только вредит.
Или как вариант - ходить не по C/C++ исходникам, а в по командам в окне disasm.

Оптимизация стоит Level 0, и сделал я это сразу после установки кейла. Никогда оптимизацию не использую.
Да хоть по Cи, хоть по disasm. Был бы disbasic sm.gif думаю так же работал.

Эта реплика к чему?
Цитата(Forger @ Jun 2 2018, 15:17) *
И вообще, изучайте инструмент, а то вон 8 страниц наплодили по сути на пустом месте sm.gif

Где про это сказано?
Forger
Цитата(maxntf @ Jun 2 2018, 15:45) *
Оптимизация стоит Level 0, и сделал я это сразу после установки кейла. Никогда оптимизацию не использую.

Вангую, что переключение задачи на активную происходит лишь при отработке прерывания системного таймера.
Если это так, то это в корне неправильно, нужно разбираться, почему так в Вас работает.
Я с таким "багом" столкнулся в старой TNKernel, что, кстати, заставило ее поменять на другую ртос - как раз на freeRTOS
В ней такого "бага" нет. Это я сразу проверил, как только освоил. В ней все работает как надо. Но с настройками повозился, к слову, отключил нафик динамическую память (у freeRTOS есть свой типа диспетчер дин. памяти)

Если весь код состоит из макросов (define), то старый компилятор кейла (v5) не умеет ходить по макросам. Новый v6 умеет.
Возможно, тут есть проблемы.

К проекту подключены исходники freeRTOS или заранее собранная библиотека (lib)?
maxntf
Цитата(Forger @ Jun 2 2018, 15:50) *
Вангую, что переключение задачи на активную происходит лишь при отработке прерывания системного таймера.

Нет.
Поставил 3 брекпоинта. Task1, Task2 и в xPortSysTickHandler.
Сразу попадаем в Task1.

P.S.
Возможно я ошибаюсь, но что то мне подсказывает, что по функции Step и Step Over отладчик не может попасть в прерывание, а собственно это и должно произойти после выход из обработчика прерывания TIM10, программа должна попасть в PendSV Handler.
Моисей Самуилович
Цитата(maxntf @ Jun 2 2018, 16:07) *
Нет.
Поставил 3 брекпоинта. Task1, Task2 и в xPortSysTickHandler.
Сразу попадаем в Task2.

P.S.
Возможно я ошибаюсь, но что то мне подсказывает, что по функции Step и Step Over отладчик не может попасть в прерывание, а собственно это и должно произойти после выход из обработчика прерывания TIM10.

Ну значит задача просто закончила свою работу и сама вызвала диспетчер. Никакой мистики.
Так все операционки устроены
Forger
Цитата(maxntf @ Jun 2 2018, 16:07) *
Нет.
Поставил 3 брекпоинта. Task1, Task2 и в xPortSysTickHandler.
Сразу попадаем в Task2.

Пройдите под отладчиком по окну дизасма, анализирую содержимое стека. В частности при выходе из прерывания.
Поставьте бряк внутри вашего прерывания, уже оттуда смотрите по шагам, лучше в окне дизасм.

И приведите код этого "проекта" (в теге CODEBOX)

Цитата(Моисей Самуилович @ Jun 2 2018, 16:17) *
Ну значит задача просто закончила свою работу и сама вызвала диспетчер. Никакой мистики. Так все операционки устроены

© "Слышу звон, да не знаю, где он" sm.gif
maxntf
И наконец поставил четвертый брекпоинт в xPortPendSVHandler.
Нахожусь на строчке portEND_SWITCHING_ISR(xHigherPriorityTaskWoken).
2 раза нажимаю Step, попадаю в Task1.
А нажимаю Run, попадаю вначале в xPortPendSVHandler, снова Run и на Task2 на строку после xSemaphoreTake
Forger
На всякий случай посмотрите, останавливается ли счет таймера (TIM10 вроде) в режиме отладки? Есть битик для этой цели.
Из-за этого возможно, пока идете по шагам, заново входите в прерывание таймер, не успев попасть PendSV.

Я тоже замечал, что отладка по шагам в Keil работает несколько "странно", что ли. Поэтому предпочитаю работать в лоб - бряки + Run.
maxntf
Цитата(Forger @ Jun 2 2018, 16:30) *
На всякий случай посмотрите, останавливается ли счет таймера (TIM10 вроде) в режиме отладки? Есть битик для этой цели.
Из-за этого возможно, пока идете по шагам, заново входите в прерывание таймер, не успев попасть PendSV.


Я даже уже перед выполнением:
Код
xSemaphoreGiveFromISR(xSem1ms, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);

Отключаю прерывания TIM10

Вот весь проект, убрал все лишнее и переименовал задачи, номер задачи соответствует приоритету, а то я и сам уже начал путаться.
CODE

xSemaphoreHandle xSem1ms;
void Task1(void *pParams);
void Task2(void *pParams);

void TIM10_IRQHandler(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
if(TIM_GetFlagStatus(TIM10, TIM_FLAG_Update) != RESET)
{
NVIC->ICER[TIM10_IRQn >> 0x05] = (uint32_t)0x01 << (TIM10_IRQn & (uint8_t)0x1F);
xSemaphoreGiveFromISR(xSem1ms, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
}
int main(void)
{
NVIC_InitTypeDef NVIC_InitStruct;

RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_HSEConfig(RCC_HSE_OFF);
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET);

SystemCoreClockUpdate();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStruct.NVIC_IRQChannel = TIM10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 14;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);

xTaskCreate(Task1, "Task1-handler", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
vTaskStartScheduler();

}
void Task1(void *pParams)
{
xTaskCreate(Task2, "Task2-handler", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
while(1);
}
void Task2(void *pParams)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

vSemaphoreCreateBinary(xSem1ms);
xSemaphoreTake(xSem1ms, 0);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, ENABLE);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 16000 - 1;
TIM_TimeBaseInitStruct.TIM_Prescaler = 0;
TIM_TimeBaseInit(TIM10, &TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM10, TIM_FLAG_Update);
TIM_ITConfig(TIM10, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM10, ENABLE);

xSemaphoreTake(xSem1ms, 100);
vTaskDelete(NULL);
}


И на всякий случай заново опишу ситуацию.
Со строчки portEND_SWITCHING_ISR(xHigherPriorityTaskWoken) если шагами, попадаем в Task1 - цикл while(1);
А если через Run, то попадаем в Task2 на строку vTaskDelete(NULL);

P.S.
И напоследок. Проверил свое убеждение, что командами Step отладчик не попадает в прерывание, а Run попадает. Проверил на том же TIM10. Включил его, сразу установил флаг прерывания - если пройти его шагами, программа дальше пойдет не попадая в прерывания. А если через Run, то в прерывания попадает.

Возможно 9 листов "ереси" того стоило? sm.gif
Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому.
Forger
Цитата(maxntf @ Jun 2 2018, 16:58) *
Возможно 9 листов "ереси" того стоило? sm.gif
Уверен что не каждый, тем более начинающий об этом знает. И шагая по программе нужно учитывать что в это время могло произойти прерывание и жизнь пошла бы по другому.

Ну, тогда можно с уверенностью сказать, что тема себя исчерпала sm.gif
Arlleex
Пардон, читал уже между строк почти последние дни и не заметил, что ТС нажимает Single Step.
В режиме пошаговой отладки отладчик локально запрещает прерывания, поэтому даже если возникает любое прерывание (насчет системных исключений не уверен) - в обработчик прерывания Вы не попадете. И это правильно - иначе Вы не отладите нормально код. При Step Over и Run обработчики по-любому будут работать как надо (полагаю, у ТС так и есть). Я когда-то тоже напарывался на такие чудеса, но со временем понял, что это более, чем правильное поведение отладчика...
maxntf
Цитата(Arlleex @ Jun 2 2018, 21:00) *
...но со временем понял, что это более, чем правильное поведение отладчика...

Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себеsm.gif). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри.
Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.
Arlleex
Цитата(maxntf @ Jun 2 2018, 22:44) *
Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себеsm.gif). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри.
Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.

IAR это позволяет. Именно при пошаговой отладке (у него есть для этого специальная галочка).
Forger
Цитата(maxntf @ Jun 2 2018, 22:44) *
Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.

Начинающему нет особый нужды ходит по шагам под отладчиком, гуляя по прерываниям: поставил куб и вперед и с песней sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.