Как запустить файл .patch с несколькими различиями внутри - PullRequest
1 голос
/ 07 ноября 2019

Я никогда не использовал файл .patch, но мне нужно запустить файл SEGGER FreeRTOSV10_Core.patch .

Показанный файл можно найти в Zip-архиве SystemView .

diff -rupN org/Source/include/FreeRTOS.h new/Source/include/FreeRTOS.h
--- org/Source/include/FreeRTOS.h   2017-11-28 13:48:34.000000000 -0800
+++ new/Source/include/FreeRTOS.h   2017-12-11 00:54:49.522222000 -0800
@@ -157,6 +157,10 @@ extern "C" {
    #define INCLUDE_uxTaskGetStackHighWaterMark 0
 #endif

+#ifndef INCLUDE_pxTaskGetStackStart
+   #define INCLUDE_pxTaskGetStackStart 0
+#endif
+
 #ifndef INCLUDE_eTaskGetState
    #define INCLUDE_eTaskGetState 0
 #endif
@@ -393,6 +397,23 @@ extern "C" {
    #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
 #endif

+#ifndef traceREADDED_TASK_TO_READY_STATE
+   #define traceREADDED_TASK_TO_READY_STATE( pxTCB )   traceMOVED_TASK_TO_READY_STATE( pxTCB )
+#endif
+
+#ifndef traceMOVED_TASK_TO_DELAYED_LIST
+   #define traceMOVED_TASK_TO_DELAYED_LIST()
+#endif
+
+#ifndef traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST
+   #define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST()
+#endif
+
+#ifndef traceMOVED_TASK_TO_SUSPENDED_LIST
+   #define traceMOVED_TASK_TO_SUSPENDED_LIST( pxTCB )
+#endif
+
+
 #ifndef traceQUEUE_CREATE
    #define traceQUEUE_CREATE( pxNewQueue )
 #endif
@@ -637,6 +658,18 @@ extern "C" {
    #define traceTASK_NOTIFY_GIVE_FROM_ISR()
 #endif

+#ifndef traceISR_EXIT_TO_SCHEDULER
+   #define traceISR_EXIT_TO_SCHEDULER()
+#endif
+
+#ifndef traceISR_EXIT
+   #define traceISR_EXIT()
+#endif
+
+#ifndef traceISR_ENTER
+   #define traceISR_ENTER()
+#endif
+
 #ifndef traceSTREAM_BUFFER_CREATE_FAILED
    #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )
 #endif
diff -rupN org/Source/include/task.h new/Source/include/task.h
--- org/Source/include/task.h   2017-11-28 13:48:34.000000000 -0800
+++ new/Source/include/task.h   2017-12-11 00:56:29.783423000 -0800
@@ -1422,6 +1422,25 @@ TaskHandle_t xTaskGetHandle( const char
  */
 UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;

+/**
+ * task.h
+ * uint8_t* pxTaskGetStackStart( TaskHandle_t xTask);
+ * + * INCLUDE_pxTaskGetStackStart должен быть установлен в 1 в FreeRTOSConfig.h, чтобы + * эта функция была доступна. + * + * Возвращает начало стека, связанного с xTask. Таким образом, + * самый высокий адрес памяти стека в архитектурах, где стек увеличивается + * из верхней памяти, и самый низкий адрес памяти в архитектурах, где стек + * растет из низкой памяти. + * + * @param xTask Дескриптор задачи, связанной с возвращенным стеком. + * Установите для xTask значение NULL, чтобы вернуть стек вызывающей задачи. + * + * @return Указатель на начало стека. + * / + uint8_t * pxTaskGetStackStart (TaskHandle_t xTask) PRIVILEGED_FUNCTION;+ / * При использовании макросов трассировки иногда необходимо включить файл task.h перед FreeRTOS.h. Когда это будет сделано, TaskHookFunction_t еще не будет определен, поэтому следующие два прототипа вызовут ошибку компиляции. Это может быть diff -rupN org / Source / portable / GCC / ARM_CM0 / port.c new / Source / portable / GCC / ARM_CM0 / port.c --- org / Source / portable / GCC / ARM_CM0 / port.c 2017-11-28 13: 48: 34.000000000 -0800 +++ new / Source / portable / GCC / ARM_CM0 / port.c 2017-12-11 01: 11: 45.061429000 -0800 @@ -333,13 +333,19 @@void xPortSysTickHandler (void) uint32_t ulPreviousMask;ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR ();+ traceISR_ENTER ();{/ * Увеличить тик RTOS. * / if (xTaskIncrementTick ()! = pdFALSE) {+ traceISR_EXIT_TO_SCHEDULER ();/ * Ожидание переключения контекста. * / * (portNVIC_INT_CTRL) = portNVIC_PENDSVSET;} + else + {+ traceISR_EXIT ();+}} portCLEAR_INTERRUPT_MASK_FROM_ISR (ulPreviousMask);} diff -rupN org / Source / portable / GCC / ARM_CM0 / portmacro.h new / Source / portable / GCC / ARM_CM0 / portmacro.h --- org / Source / portable / GCC / ARM_CM0 / portmacro.h 2017-11-28 13: 48: 34.000000000 -0800 +++ new / Source / portable / GCC / ARM_CM0 / portmacro.h 2017-12-11 01: 10: 27.732228000 -0800 @@ -82,7 +82,7 @@ extern voidvPortYield (void);#define portNVIC_INT_CTRL_REG (* ((летучий uint32_t *) 0xe000ed04)) #define portNVIC_PENDSVSET_BIT (1UL << 28UL) #define portYIELD () vPortYield () - # определить portEND_SWITCHING_ISR (xSwitchRequired), если (xSwitchRequired) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT + # определить portEND_SWITCHING_ISR (xSwitchRequired) {if (xSwitchRequired) {traceISR_EXIT_TO_SCHEDULER ();portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;} else {traceISR_EXIT ();}} #define portYIELD_FROM_ISR (x) portEND_SWITCHING_ISR (x) / * ----------------------------------------------------------- * / diff -rupN org / Source / portable / GCC / ARM_CM3 / port.c new / Source / portable / GCC / ARM_CM3/port.c --- org / Source / portable / GCC / ARM_CM3 / port.c 2017-11-28 13: 48: 34.000000000 -0800 +++ new / Source / portable / GCC / ARM_CM3 / port.c 2017-12-11 01: 14: 50.515630000 -0800 @@ -431,14 +431,20 @@ void xPortSysTickHandler (void) сохраните, а затем восстановите значение маски прерывания, поскольку ее значение уже известно. * / portDISABLE_INTERRUPTS ();+ traceISR_ENTER ();{/ * Увеличить тик RTOS. * / if (xTaskIncrementTick ()! = pdFALSE) {+ traceISR_EXIT_TO_SCHEDULER ();/ * Требуется переключение контекста. Переключение контекста выполняется в прерывании PendSV. Ожидание прерывания PendSV. * / portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;} + else + {+ traceISR_EXIT ();+}} portENABLE_INTERRUPTS ();} diff -rupN org / Source / portable / GCC / ARM_CM3 / portmacro.h new / Source / portable / GCC / ARM_CM3 / portmacro.h --- org / Источник / переносной / GCC / ARM_CM3 / portmacro.h 2017-11-28 13: 48: 34.000000000 -0800 +++ new / Source / portable / GCC / ARM_CM3 / portmacro.h 2017-12-11 01: 13: 36.868029000 -0800@@ -90,7 +90,7 @@ typedef unsigned long UBaseType_t;#define portNVIC_INT_CTRL_REG (* ((летучий uint32_t *) 0xe000ed04)) #define portNVIC_PENDSVSET_BIT (1UL << 28UL) - # определить portEND_SWITCHING_ISR (xSwitchRequired), если (xSwitchRequired = pdFALSE!) portYIELD () + # определить portEND_SWITCHING_ISR (xSwitchRequired) {}, если(xSwitchRequired! = pdFALSE) {traceISR_EXIT_TO_SCHEDULER ();portYIELD ()} else {traceISR_EXIT ();}} #define portYIELD_FROM_ISR (x) portEND_SWITCHING_ISR (x) / * ----------------------------------------------------------- * / diff -rupN org / Source / portable / GCC / ARM_CM4F / port.c new / Source / portable / GCC / ARM_CM4F/port.c --- org / Source / portable / GCC / ARM_CM4F / port.c 2017-11-28 13: 48: 34.000000000 -0800 +++ new / Source / portable / GCC / ARM_CM4F / port.c 2017-12-11 01: 16: 01.771230000 -0800 @@ -493,14 +493,20 @@ void xPortSysTickHandler (void) сохраните, а затем восстановите значение маски прерывания, поскольку ее значение уже известно. * / portDISABLE_INTERRUPTS ();+ traceISR_ENTER ();{/ * Увеличить тик RTOS. * / if (xTaskIncrementTick ()! = pdFALSE) {+ traceISR_EXIT_TO_SCHEDULER ();/ * Требуется переключение контекста. Переключение контекста выполняется в прерывании PendSV. Ожидание прерывания PendSV. * / portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;} + else + {+ traceISR_EXIT ();+}} portENABLE_INTERRUPTS ();} diff -rupN org / Source / portable / GCC / ARM_CM4F / portmacro.h new / Источник / portable / GCC / ARM_CM4F / portmacro.h --- org / Source / portable / GCC / ARM_CM4F / portmacro.h 2017-11-28 13: 48: 34.000000000 -0800 +++ new / Source / portable / GCC / ARM_CM4F / portmacro.h 2017-12-11 01: 15: 16.546830000 -0800 @@ -90,7 +90,7 @@ typedef unsignedlong UBaseType_t;#define portNVIC_INT_CTRL_REG (* ((летучий uint32_t *) 0xe000ed04)) #define portNVIC_PENDSVSET_BIT (1UL << 28UL) - # определить portEND_SWITCHING_ISR (xSwitchRequired), если (! xSwitchRequired = pdFALSE) portYIELD () + # определить portEND_SWITCHING_ISR (xSwitchRequired) {если (xSwitchRequired! = pdFALSE) {traceISR_EXIT_TO_SCHEDULER ();portYIELD ();} else {traceISR_EXIT ();}} #define portYIELD_FROM_ISR (x) portEND_SWITCHING_ISR (x) / * ----------------------------------------------------------- * / diff -rupN org / Source / tasks.c new / Source / tasks.c --- org / Source / tasks.c 2017-11-28 13: 48: 34.000000000 -0800 +++ new / Source / tasks.c 2017-12-11 01: 08: 48.591428000 -0800 @@ -237,6 +237,17 @@ count overflows,* / taskRECORD_READY_PRIORITY ((pxTCB) -> uxPriority);\ vListInsertEnd (& (pxReadyTasksLists [(pxTCB) -> uxPriority]), & ((pxTCB) -> xStateListItem));\ tracePOST_MOVED_TASK_TO_READY_STATE (pxTCB) + + / * + * Поместите задачу, представленную pxTCB, которая была в списке готовности перед + *, в соответствующий список готовности для задачи. + * Вставляется в конец списка. + * / + # define prvReaddTaskToReadyList (pxTCB) \ + traceREADDED_TASK_TO_READY_STATE (pxTCB);\ + taskRECORD_READY_PRIORITY ((pxTCB) -> uxPriority);\ + vListInsertEnd (& (pxReadyTasksLists [(pxTCB) -> uxPriority]), & ((pxTCB) -> xStateListItem));\ + tracePOST_MOVED_TASK_TO_READY_STATE (pxTCB) / * ----------------------------------------------------------- * / / * @@ -1598,7 +1609,7 @@ static void prvAddNewTaskToReadyList (TC {mtCOVERAGE_TEST_MARKER ();} - prvAddTaskToReadyList (pxTCB);+ prvReaddTaskToReadyList (pxTCB);} else {@@ -1659,7 +1670,7 @@ static void prvAddNewTaskToReadyList (TC {mtCOVERAGE_TEST_MARKER ();} - + traceMOVED_TASK_TO_SUSPENDTC_L (px);vListInsertEnd (& xSuspendedTaskList, & (pxTCB-> xStateListItem));#if (configUSE_TASK_NOTIFICATIONS == 1) @@ -3671,6 +3682,20 @@ static void prvCheckTasksWaitingTerminat #endif / * INCLUDE_uxTaskGetStackHighWaterMark * / / * ----------------------------------------------------------- * / + # if (INCLUDE_pxTaskGetStackStart ==1) + uint8_t * pxTaskGetStackStart (TaskHandle_t xTask) + {+ TCB_t * pxTCB;+ UBaseType_t uxReturn;+ (void) uxReturn;+ + pxTCB = prvGetTCBFromHandle (xTask);+ return (uint8_t *) pxTCB-> pxStack;+} + + # endif / * INCLUDE_pxTaskGetStackStart * / + / * ----------------------------------------------------------- * / + #if (INCLUDE_vTaskDelete == 1) static void prvDeleteTCB (TCB_t * pxTCB) @@ -3840,7 +3865, 7 @@ TCB_t * pxTCB;/ * Наследовать приоритет перед перемещением в новый список. * / pxMutexHolderTCB-> uxPriority = pxCurrentTCB-> uxPriority;- prvAddTaskToReadyList (pxMutexHolderTCB);+ prvReaddTaskToReadyList (pxMutexHolderTCB);} else {@@ -3930,7 +3955,7 @@ TCB_t * pxTCB;любая другая цель, если эта задача выполняется, и она должна быть запущена, чтобы вернуть мьютекс. * / listSET_LIST_ITEM_VALUE (& (pxTCB-> xEventListItem), (TickType_t) configMAX_PRIORITIES - (TickType_t) pxTCB-> uxPriority);/ * lint! e961 Исключение MISRA, так как приведение является избыточным только для некоторых портов. * / - prvAddTaskToReadyList (pxTCB);+ prvReaddTaskToReadyList (pxTCB);/ * Вернуть true, чтобы указать, что требуется переключение контекста. На самом деле это требуется только в угловом случае, когда @@ -4940,6 +4965,7 @@ const TickType_t xConstTickCount = xTick / * Добавьте задачу в список приостановленных задач вместо списка отложенных задач, чтобы убедиться, что он не проснулсявременное событие. Это будет блокировать на неопределенный срок. * / + traceMOVED_TASK_TO_SUSPENDED_LIST (pxCurrentTCB);vListInsertEnd (& xSuspendedTaskList, & (pxCurrentTCB-> xStateListItem));} else @@ -4956,12 +4982,14 @@ const TickType_t xConstTickCount = xTick {/ * Время пробуждения истекло. Поместите этот элемент в список переполнения. * / + traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST ();vListInsert (pxOverflowDelayedTaskList, & (pxCurrentTCB-> xStateListItem));} else {/ * Время пробуждения не переполнено, поэтому используется текущий список блокировки. * / + traceMOVED_TASK_TO_DELAYED_LIST ();vListInsert (pxDelayedTaskList, & (pxCurrentTCB-> xStateListItem));/ * Если задача, входящая в заблокированное состояние, была помещена в @@ -4991,11 +5019,13 @@ const TickType_t xConstTickCount = xTick if (xTimeToWake xStateListItem));} else {/ * Время пробуждения не переполнено, поэтому используется текущий список блокировки. * / + traceMOVED_TASK_TO_DELAYED_LIST ();vListInsert (pxDelayedTaskList, & (pxCurrentTCB-> xStateListItem));/ * Если задача, входящая в заблокированное состояние, была помещена в начало

Я попытался запустить этот файл .patch в моем Windows bash следующим образом:

$ patch /c/Users/ps/Documents/Git/STM32L432/Middlewares/Third_Party/FreeRTOS /c/Users/ps/Documents/Git/STM32L432/SEGGER/FreeRTOSV10/Patch/FreeRTOSV10_Core.patch

Но яполучите следующее сообщение об ошибке

File /c/Users/ps/Documents/Git/STM32L432/Middlewares/Third_Party/FreeRTOS is not a regular file -- refusing to patch

Конечно, путь /c/Users/ps/Documents/Git/STM32L432/Middlewares/Third_Party/FreeRTOS не является путем к файлу, но он должен быть корневым путем для всех diff-команд. Итак, как определить корневой путь или объединить более одного пути, чтобы использовать файл .patch с несколькими разностями внутри?

КСТАТИ:

$ patch --help
Usage: patch [OPTION]... [ORIGFILE [PATCHFILE]]

Мне не помогает ...

РЕДАКТИРОВАТЬ 1

Теперь я попытался запустить bash из каталога Source и попробовать вызвать патчвот так

PS@PCENTW-PS MINGW64 ~/Documents/Git/STM32L432/Middlewares/Third_Party/FreeRTOS/Source (UseSystemView)
$ patch < /c/Users/ps/Documents/Git/STM32L432/SEGGER/FreeRTOSV10/Patch/FreeRTOSV10_Core.patch
can't find file to patch at input line 4
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|diff -rupN org/Source/include/FreeRTOS.h new/Source/include/FreeRTOS.h
|--- org/Source/include/FreeRTOS.h      2017-11-28 13:48:34.000000000 -0800
|+++ new/Source/include/FreeRTOS.h      2017-12-11 00:54:49.522222000 -0800
--------------------------
File to patch:

Кажется, это намного лучше, чем мой предыдущий звонок. Но независимо от того, я получаю ошибку can't find file to patch at input line 4

1 Ответ

0 голосов
/ 09 ноября 2019
  1. Открыть cmd.exe
  2. Перейти в исходный каталог, в котором находятся все файлы
    1. $ cd .../Source
  3. Запустить патч. exe
    1. $ patch < .../FreeRTOSV10_Core.patch
  4. Определить конкретные файлы для исправления
    1. File to patch: .../FreeRTOS.h
  5. FINISH
...